index.ts
1.92 KB
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
65
66
67
68
69
70
71
72
73
74
75
import type { RouteLocationNormalized } from 'vue-router'
import { defineStore } from 'pinia'
import {
DEFAULT_ROUTE,
DEFAULT_ROUTE_NAME,
REDIRECT_ROUTE_NAME,
} from '@/router/constants'
import { isString } from '@/utils/is'
import { TabBarState, TagProps } from './types'
// import {state} from "vue-tsc/out/shared";
const formatTag = (route: RouteLocationNormalized): TagProps => {
const { name, meta, fullPath, query } = route
return {
title: meta.locale || '',
name: String(name),
fullPath,
query,
ignoreCache: meta.ignoreCache,
}
}
const BAN_LIST = [REDIRECT_ROUTE_NAME]
const useAppStore = defineStore('tabBar', {
state: (): TabBarState => ({
cacheTabList: new Set([DEFAULT_ROUTE_NAME]),
tagList: [DEFAULT_ROUTE]
}),
getters: {
getTabList(): TagProps[] {
return this.tagList
},
getCacheList(): string[] {
return Array.from(this.cacheTabList)
}
},
actions: {
updateTabList(route: RouteLocationNormalized) {
if (BAN_LIST.includes(route.name as string)) return
this.tagList.push(formatTag(route))
if (!route.meta.ignoreCache) {
this.cacheTabList.add(route.name as string)
}
},
deleteTag(idx: number, tag: TagProps) {
this.tagList.splice(idx, 1)
this.cacheTabList.delete(tag.name)
},
addCache(name: string) {
if (isString(name) && name !== '') this.cacheTabList.add(name)
},
deleteCache(tag: TagProps) {
this.cacheTabList.delete(tag.name)
},
freshTabList(tags: TagProps[]) {
this.tagList = tags
this.cacheTabList.clear()
// 要先判断ignoreCache
this.tagList
.filter((el) => !el.ignoreCache)
.map((el) => el.name)
.forEach((x) => this.cacheTabList.add(x))
},
resetTabList() {
this.tagList = [DEFAULT_ROUTE]
this.cacheTabList.clear()
this.cacheTabList.add(DEFAULT_ROUTE_NAME)
}
},
})
export default useAppStore