// vuex `mapGetters` 的 pinia 等价物。
|
//
|
// 老工程有 53 个文件写的是 `import { mapGetters } from 'vuex'`,
|
// 用法都是 `computed: { ...mapGetters(['nickName']) }`。Vue3 侧状态管理换成 pinia 后
|
// 没有 getters 聚合层了,所以这里按原 `store/getters.js` 的映射逐条补回来,
|
// 并**沿用 mapGetters 这个名字**——调用点一个字都不用改,codemod 只改 import 来源。
|
//
|
// 注意 `userId` 取的是 user store 的 `id`,不是 `userId`:原 getters.js 里就是
|
// `userId: (state) => state.user.id`,照着抄才对得上。
|
import useAppStore from '@/store/modules/app'
|
import useUserStore from '@/store/modules/user'
|
import useTagsViewStore from '@/store/modules/tagsView'
|
import usePermissionStore from '@/store/modules/permission'
|
import useDictStore from '@/store/modules/dict'
|
|
// 键 = 原 vuex getter 名;值 = 惰性取 pinia state。
|
// 惰性(而不是模块加载时求值)是必需的:store 实例只能在应用挂载后创建。
|
const GETTERS = {
|
// app
|
sidebar: () => useAppStore().sidebar,
|
size: () => useAppStore().size,
|
device: () => useAppStore().device,
|
// tagsView
|
visitedViews: () => useTagsViewStore().visitedViews,
|
cachedViews: () => useTagsViewStore().cachedViews,
|
// dict
|
dict: () => useDictStore().dict,
|
// user
|
token: () => useUserStore().token,
|
avatar: () => useUserStore().avatar,
|
name: () => useUserStore().name,
|
nickName: () => useUserStore().nickName,
|
nameEn: () => useUserStore().nameEn,
|
userName: () => useUserStore().userName,
|
userId: () => useUserStore().id,
|
roles: () => useUserStore().roles,
|
permissions: () => useUserStore().permissions,
|
// permission
|
permission_routes: () => usePermissionStore().routes,
|
topbarRouters: () => usePermissionStore().topbarRouters,
|
defaultRoutes: () => usePermissionStore().defaultRoutes,
|
sidebarRouters: () => usePermissionStore().sidebarRouters
|
}
|
|
/**
|
* 与原 vuex `mapGetters` 用法一致(支持数组与对象两种写法),返回可直接摊进 computed 的对象。
|
* 未登记的名字会告警并置为 undefined,避免静默拿到 undefined 却查不出原因。
|
*/
|
export function mapGetters(keys) {
|
const list = Array.isArray(keys) ? keys : Object.keys(keys)
|
const out = {}
|
for (const key of list) {
|
// 对象写法 mapGetters({ alias: 'realName' }) 里 key 是别名、value 才是 getter 名
|
const real = Array.isArray(keys) ? key : keys[key]
|
const get = GETTERS[real]
|
if (!get) {
|
console.warn(`[store-compat] 没有 ${real} 对应的 pinia 取法,已置为 undefined`)
|
out[key] = () => undefined
|
continue
|
}
|
out[key] = get
|
}
|
return out
|
}
|