gaoluyang
5 天以前 c7566bba45e6f90594d36ec4b80ac4ff89f577ee
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
// 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
}