首页 > 其他分享 >在Vue3中使用vuex

在Vue3中使用vuex

时间:2024-10-15 13:43:07浏览次数:12  
标签:const Vuex Vue3 state key 使用 权限 vuex permissions

Vuex 简介

Vuex 是 Vue.js 官方的状态管理库,帮助我们在中大型应用中集中管理组件间的共享状态。它通过 stategettersmutationsactions 实现响应式数据管理


Vuex 核心概念

  • State: 全局状态,存储应用的核心数据。
  • Getters: 类似于组件中的计算属性,用于从 state 中派生出新的数据。
  • Mutations: 修改 state 的唯一方式,必须是同步操作。
  • Actions: 用于处理异步逻辑,最终通过 commit 触发 mutations 来改变 state

使用案例

在这个案例中,我们将构建一个权限管理的场景。不同的用户角色会拥有不同的权限,基于这些权限,前端界面会展示或隐藏相应的按钮。

1、 Vuex Store (权限管理模块)

import { getComponentList } from '@/api/Component';

export default {
  namespaced: true,
  state: () => ({
    componentPermissions: {}  // 存储各个页面的权限列表
  }),
  getters: {
    getPermissionByKey: (state) => (key) => {
      return state.componentPermissions[key] || {};  // 根据页面名称获取权限
    }
  },
  mutations: {
    setPermission(state, { key, permissions }) {
      state.componentPermissions = {
        ...state.componentPermissions,
        [key]: permissions
      };
    }
  },
  actions: {
    async fetchPermissions({ commit }, key) {
      const response = await getComponentList({ name: key });
      if (response.data.code === 2000) {
        commit('setPermission', { key, permissions: response.data.data });
      }
    }
  }
};

  • State: componentPermissions 保存每个页面的权限列表,以页面 key 作为字段名。
  • Mutations: setPermission 用于更新权限。
  • Actions: fetchPermissions 处理异步请求,获取权限数据并存入 state。
  • Getters: getPermissionByKey 根据页面名称获取对应的权限。

2、在组件中使用 Vuex 权限管理

我们在组件中先从 Vuex 获取权限列表,如果权限不存在,则调用 fetchPermissions

<template>
  <div>
    <div v-show="canShowNewPlanButton" class="button-container">
      <a-button type="primary" @click="showPointPlanAddModal">新建计划</a-button>
    </div>
  </div>
</template>

<script setup>
import { onMounted, ref } from 'vue';
import { useStore } from 'vuex';
import { useRoute } from 'vue-router';

const canShowNewPlanButton = ref(false);  // 控制按钮显示状态
const store = useStore();
const route = useRoute();

// 在组件加载时根据权限展示按钮
onMounted(async () => {
  const key = route.name;
  
  // 从 Vuex 获取权限
  const permissions = store.getters['permission/getPermissionByKey'](key);

  // 如果权限已经存在则直接赋值,不存在则调接口
  if (permissions.new_plan !== undefined) {
    canShowNewPlanButton.value = permissions.new_plan;
  } else {
    await store.dispatch('permission/fetchPermissions', key);
    const updatedPermissions = store.getters['permission/getPermissionByKey'](key);
    canShowNewPlanButton.value = updatedPermissions.new_plan;
  }
});
</script>

总结

  • 组件内使用 useStore 和 useRoute: 我们通过 useStore 获取 Vuex 实例,通过 useRoute 获取当前页面的路由信息,用于匹配对应的权限。
  • 权限获取逻辑:
    • 先从 Vuex 的 getters 中获取对应页面的权限数据。
    • 如果 Vuex 中没有权限数据,调用 fetchPermissions 异步获取数据,并更新 Vuex 状态。
    • 根据权限的 new_plan 字段决定是否展示按钮。

标签:const,Vuex,Vue3,state,key,使用,权限,vuex,permissions
From: https://www.cnblogs.com/wellplayed/p/18467341

相关文章

  • OpenCV高级图形用户界面(11)检查是否有键盘事件发生而不阻塞当前线程函数pollKey()的
    操作系统:ubuntu22.04OpenCV版本:OpenCV4.9IDE:VisualStudioCode编程语言:C++11算法描述轮询已按下的键。函数pollKey无等待地轮询键盘事件。它返回已按下的键的代码或如果没有键自上次调用以来被按下则返回-1。若要等待按键被按下,请使用waitKey。注意waitKey......
  • OpenCV高级图形用户界面(8)在指定的窗口中显示一幅图像函数imshow()的使用
    操作系统:ubuntu22.04OpenCV版本:OpenCV4.9IDE:VisualStudioCode编程语言:C++11算法描述在指定的窗口中显示一幅图像。函数imshow在指定的窗口中显示一幅图像。如果窗口是以cv::WINDOW_AUTOSIZE标志创建的,图像将以原始大小显示,不过仍然受限于屏幕分辨率。否则,图像......
  • OpenCV高级图形用户界面(9)更改指定窗口的位置函数moveWindow()的使用
    操作系统:ubuntu22.04OpenCV版本:OpenCV4.9IDE:VisualStudioCode编程语言:C++11算法描述将窗口移动到指定的位置。cv::moveWindow()函数用于更改指定窗口的位置。你可以使用这个函数来移动窗口到屏幕上的任何位置。函数原型voidcv::moveWindow ( constString......
  • 探索桂林:使用SpringBoot构建的旅游平台
    1系统概述1.1研究背景随着计算机技术的发展以及计算机网络的逐渐普及,互联网成为人们查找信息的重要场所,二十一世纪是信息的时代,所以信息的管理显得特别重要。因此,使用计算机来管理桂林旅游景点导游平台的相关信息成为必然。开发合适的桂林旅游景点导游平台,可以方便管理人......
  • 电销企业 不使用外呼系统 会面临哪些问题!!
    电销企业不使用外呼系统,会面临诸多挑战和限制业务开展效率方面:手动拨号效率低:没有外呼系统,员工只能手动在电话上逐个输入号码进行拨号,这一过程非常耗时,严重影响每日的电话拨打量和业务推进速度。例如,一个熟练的电销人员手动拨号可能每分钟只能拨打2-3个电话,而使用外......
  • JedisCluster 中psetex()方法如何使用
    JedisCluster 中的 psetex 方法用于设置一个键值对,并同时设置该键的过期时间(以毫秒为单位)。与 setex 的区别在于 psetex 接受的过期时间是以毫秒为单位,而 setex 接受的是以秒为单位。psetex方法说明方法签名:publicStringpsetex(Stringkey,longmilliseconds......