Skip to content

Commit 2f7200a

Browse files
committed
feat: 从vue-element-plus-admin项目 同步TagsView代码 实现设置路由标题功能
1 parent 9849a04 commit 2f7200a

File tree

2 files changed

+80
-45
lines changed

2 files changed

+80
-45
lines changed

src/layout/components/TagsView/src/TagsView.vue

Lines changed: 56 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,21 @@ import { useDesign } from '@/hooks/web/useDesign'
1212
import { useTemplateRefsList } from '@vueuse/core'
1313
import { ElScrollbar } from 'element-plus'
1414
import { useScrollTo } from '@/hooks/event/useScrollTo'
15+
import { useTagsView } from '@/hooks/web/useTagsView'
16+
import { cloneDeep } from 'lodash-es'
17+
18+
19+
defineOptions({ name: 'TagsView' })
1520
1621
const { getPrefixCls } = useDesign()
1722
1823
const prefixCls = getPrefixCls('tags-view')
1924
2025
const { t } = useI18n()
2126
22-
const { currentRoute, push, replace } = useRouter()
27+
const { currentRoute, push } = useRouter()
28+
29+
const { closeAll, closeLeft, closeRight, closeOther, closeCurrent, refreshPage } = useTagsView()
2330
2431
const permissionStore = usePermissionStore()
2532
@@ -31,6 +38,10 @@ const visitedViews = computed(() => tagsViewStore.getVisitedViews)
3138
3239
const affixTagArr = ref<RouteLocationNormalizedLoaded[]>([])
3340
41+
const selectedTag = computed(() => tagsViewStore.getSelectedTag)
42+
43+
const setSelectTag = tagsViewStore.setSelectedTag
44+
3445
const appStore = useAppStore()
3546
3647
const tagsViewImmerse = computed(() => appStore.getTagsViewImmerse)
@@ -45,82 +56,73 @@ const initTags = () => {
4556
for (const tag of unref(affixTagArr)) {
4657
// Must have tag name
4758
if (tag.name) {
48-
tagsViewStore.addVisitedView(tag)
59+
tagsViewStore.addVisitedView(cloneDeep(tag))
4960
}
5061
}
5162
}
5263
53-
const selectedTag = ref<RouteLocationNormalizedLoaded>()
54-
5564
// 新增tag
5665
const addTags = () => {
5766
const { name } = unref(currentRoute)
5867
if (name) {
59-
selectedTag.value = unref(currentRoute)
68+
setSelectTag(unref(currentRoute))
6069
tagsViewStore.addView(unref(currentRoute))
6170
}
62-
return false
6371
}
6472
6573
// 关闭选中的tag
6674
const closeSelectedTag = (view: RouteLocationNormalizedLoaded) => {
67-
if (view?.meta?.affix) return
68-
tagsViewStore.delView(view)
69-
if (isActive(view)) {
70-
toLastView()
75+
closeCurrent(view, () => {
76+
if (isActive(view)) {
77+
toLastView()
78+
}
79+
})
80+
}
81+
82+
// 去最后一个
83+
const toLastView = () => {
84+
const visitedViews = tagsViewStore.getVisitedViews
85+
const latestView = visitedViews.slice(-1)[0]
86+
if (latestView) {
87+
push(latestView)
88+
} else {
89+
if (
90+
unref(currentRoute).path === permissionStore.getAddRouters[0].path ||
91+
unref(currentRoute).path === permissionStore.getAddRouters[0].redirect
92+
) {
93+
addTags()
94+
return
95+
}
96+
// You can set another route
97+
push(permissionStore.getAddRouters[0].path)
7198
}
7299
}
73100
74101
// 关闭全部
75102
const closeAllTags = () => {
76-
tagsViewStore.delAllViews()
77-
toLastView()
103+
closeAll(() => {
104+
toLastView()
105+
})
78106
}
79107
80108
// 关闭其它
81109
const closeOthersTags = () => {
82-
tagsViewStore.delOthersViews(unref(selectedTag) as RouteLocationNormalizedLoaded)
110+
closeOther()
83111
}
84112
85113
// 重新加载
86114
const refreshSelectedTag = async (view?: RouteLocationNormalizedLoaded) => {
87-
if (!view) return
88-
tagsViewStore.delCachedView()
89-
const { path, query } = view
90-
await nextTick()
91-
replace({
92-
path: '/redirect' + path,
93-
query: query
94-
})
115+
refreshPage(view)
95116
}
96117
97118
// 关闭左侧
98119
const closeLeftTags = () => {
99-
tagsViewStore.delLeftViews(unref(selectedTag) as RouteLocationNormalizedLoaded)
120+
closeLeft()
100121
}
101122
102123
// 关闭右侧
103124
const closeRightTags = () => {
104-
tagsViewStore.delRightViews(unref(selectedTag) as RouteLocationNormalizedLoaded)
105-
}
106-
107-
// 跳转到最后一个
108-
const toLastView = () => {
109-
const visitedViews = tagsViewStore.getVisitedViews
110-
const latestView = visitedViews.slice(-1)[0]
111-
if (latestView) {
112-
push(latestView)
113-
} else {
114-
if (
115-
unref(currentRoute).path === permissionStore.getAddRouters[0].path ||
116-
unref(currentRoute).path === permissionStore.getAddRouters[0].redirect
117-
) {
118-
addTags()
119-
return
120-
}
121-
// TODO: You can set another route
122-
push('/')
123-
}
125+
closeRight()
124126
}
125127
126128
// 滚动到选中的tag
@@ -209,13 +211,14 @@ const isActive = (route: RouteLocationNormalizedLoaded): boolean => {
209211
// 所有右键菜单组件的元素
210212
const itemRefs = useTemplateRefsList<ComponentRef<typeof ContextMenu & ContextMenuExpose>>()
211213
212-
// 右键菜单装填改变的时候
214+
// 右键菜单状态改变的时候
213215
const visibleChange = (visible: boolean, tagItem: RouteLocationNormalizedLoaded) => {
214216
if (visible) {
215217
for (const v of unref(itemRefs)) {
216218
const elDropdownMenuRef = v.elDropdownMenuRef
217219
if (tagItem.fullPath !== v.tagItem.fullPath) {
218220
elDropdownMenuRef?.handleClose()
221+
setSelectTag(tagItem)
219222
}
220223
}
221224
}
@@ -243,6 +246,16 @@ const move = (to: number) => {
243246
start()
244247
}
245248
249+
const canShowIcon = (item: RouteLocationNormalizedLoaded) => {
250+
if (
251+
(item?.matched?.[1]?.meta?.icon && unref(tagsViewIcon)) ||
252+
(item?.meta?.affix && unref(tagsViewIcon) && item?.meta?.icon)
253+
) {
254+
return true
255+
}
256+
return false
257+
}
258+
246259
onBeforeMount(() => {
247260
initTags()
248261
addTags()

src/store/modules/tagsView.ts

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,23 +4,29 @@ import { getRawRoute } from '@/utils/routerHelper'
44
import { defineStore } from 'pinia'
55
import { store } from '../index'
66
import { findIndex } from '@/utils'
7+
import { useUserStoreWithOut } from './user'
78

89
export interface TagsViewState {
910
visitedViews: RouteLocationNormalizedLoaded[]
1011
cachedViews: Set<string>
12+
selectedTag?: RouteLocationNormalizedLoaded
1113
}
1214

1315
export const useTagsViewStore = defineStore('tagsView', {
1416
state: (): TagsViewState => ({
1517
visitedViews: [],
16-
cachedViews: new Set()
18+
cachedViews: new Set(),
19+
selectedTag: undefined
1720
}),
1821
getters: {
1922
getVisitedViews(): RouteLocationNormalizedLoaded[] {
2023
return this.visitedViews
2124
},
2225
getCachedViews(): string[] {
2326
return Array.from(this.cachedViews)
27+
},
28+
getSelectedTag(): RouteLocationNormalizedLoaded | undefined {
29+
return this.selectedTag
2430
}
2531
},
2632
actions: {
@@ -98,8 +104,12 @@ export const useTagsViewStore = defineStore('tagsView', {
98104
},
99105
// 删除所有tag
100106
delAllVisitedViews() {
107+
const userStore = useUserStoreWithOut()
108+
101109
// const affixTags = this.visitedViews.filter((tag) => tag.meta.affix)
102-
this.visitedViews = []
110+
this.visitedViews = userStore.getUser
111+
? this.visitedViews.filter((tag) => tag?.meta?.affix)
112+
: []
103113
},
104114
// 删除其他
105115
delOthersViews(view: RouteLocationNormalizedLoaded) {
@@ -145,6 +155,18 @@ export const useTagsViewStore = defineStore('tagsView', {
145155
break
146156
}
147157
}
158+
},
159+
// 设置当前选中的tag
160+
setSelectedTag(tag: RouteLocationNormalizedLoaded) {
161+
this.selectedTag = tag
162+
},
163+
setTitle(title: string, path?: string) {
164+
for (const v of this.visitedViews) {
165+
if (v.path === (path ?? this.selectedTag?.path)) {
166+
v.meta.title = title
167+
break
168+
}
169+
}
148170
}
149171
},
150172
persist: false

0 commit comments

Comments
 (0)