vue3监听pinia数据的变化,更新页面数据

6,855 阅读1分钟

问题:用户登录成功后根据用户token获取用户信息,getInfo接口还没有成功返回,系统已进入主页,导致主页头部展示的用户类型无法正常显示。

/* 用户信息 */
import { serverApi } from '@/api'
import { defineStore, StoreDefinition } from 'pinia'
export const useUserInfosStore: StoreDefinition<'userInfos'> = defineStore({
  id: 'userInfos',
  state: (): { userInfo } => ({
    userInfo: {}, //基本信息
  }),
  actions: {
    /**
     * @function 设置用户信息
     */
    async setUserInfos() {
      const res = await serverApi.use('GET:/kqcs/getInfo')()
      const info = res.data
      this.userInfo = info || {}
      return this.userInfo
    },

  },
})

// 此写法如果actions异步接口getInfo请求时间较长,此页面已经渲染,导致userName取不到
import { useUserInfosStore } from '@/store'

const userInfo = useUserInfosStore().userInfo
userName.value = userInfo.userName

解决:通过subscribe监听storev变化,更新页面数据

const subscribe = store.$subscribe(
  (mutation, state) => {
    /*
      * mutation主要包含三个属性值:
      *   events:当前state改变的具体数据,包括改变前的值和改变后的值等等数据
      *   storeId:是当前store的id
      *   type:用于记录这次数据变化是通过什么途径,主要有三个分别是
      *         “direct” :通过 action 变化的
                ”patch object“ :通过 $patch 传递对象的方式改变的
                “patch function” :通过 $patch 传递函数的方式改变的
      *
      * */
    // 在此处监听store中值的变化,当变化为某个值的时候,做一些业务操作
    userName.value = state.userInfo.userName
  },
  { detached: false }
    // detached:布尔值,默认是 false,正常情况下,当订阅所在的组件被卸载时,订阅将被停止删除,
    // 如果设置detached值为 true 时,即使所在组件被卸载,订阅依然在生效
    // 参考文档:https://pinia.web3doc.top/core-concepts/state.html#%E8%AE%A2%E9%98%85%E7%8A%B6%E6%80%81

)

 
// 停止订阅
// subscribe()  //调用上方声明的变量值,示例(subscribe),即可以停止订阅