在使用Vue的项目中,有这样一种场景:我们需要一个全局变量,但这个触发全局变量的方法又只能在某一个组件中触发,怎么触发呢?触发时机是什么?
假设触发全局变量的方法为:useStore.setRole(),全局存储的角色变量为role,则:
理论上,全局事件可以在任何时候触发。对于vue组件,在mounted生命周期中触发是最常见的。在本示例中,我们希望调用该全局变量,获取到用户角色,并根据用户角色来控制一些页面的操作。所以,调用该全局变量的时间是在组件挂在以后,nexttick中执行。代码如下:
onMounted(() => {
queryList()
nextTick(() => {
useStore.setRole()
})
})
本示例中,我们使用的是vue3框架,所以挂载完成的生命周期名称为onMounted。组件挂载完成后,执行两件事:1. 请求数据queryList();2.获取用户角色,在nextTick中执行useStore.setRole()方法。
在该全局事件中,我们只列举了一个简单的功能:获取用户信息,并保存用户是哪种角色。示例如下:
import Cookies from 'js-cookie'
import { defineStore } from 'pinia';
import Service from '../../api/index';
const useStore = defineStore(
'user',
{
state: () => ({
loginUserInfo: {},
isReadonly: false,
isOperation: false,
isAdministrator: false
}),
actions: {
setUserState() {
let addcount = Cookies.get('ad-account')
Service.getUser(account).then(res => {
this.loginUserInfo = data
this.isReadonly = data?.role === 0
this.isOperation = data?.role === 1
this.isAdministrator = data?.role === 2
})
},
}
}
)
export default useStore
我们使用的pinia来存储全局变量,定义全局事件的方法如上。
在vue组件中使用全局变量的方法为:
import useStore from '../../store/modules/user'
let isReadOnly = computed(() => useStore().isReadonly)
let isOperation = computed(() => useStore().isOperation)
let isAdministrator = computed(() => useStore().isAdministrator)
在组件中定义了三个变量:isReadOnly、isOperation、isAdministrator,分别通过computed来计算得到变量的值。这样,当组件中没加载并执行一次useStore.setRole()方法,全局定义的isReadonly、isOperation、isAdministrator就会改变,在该组件中自定义的变量也会同步变化,省去了再重复计算的过程。