| | |
| | | import { TagView, RouteRecordNormalized, RouteLocationNormalized } from 'vue-router'; |
| | | import { RouteLocationNormalized } from 'vue-router'; |
| | | |
| | | export const useTagsViewStore = defineStore('tagsView', () => { |
| | | const visitedViews = ref<TagView[]>([]); |
| | | const visitedViews = ref<RouteLocationNormalized[]>([]); |
| | | const cachedViews = ref<string[]>([]); |
| | | const iframeViews = ref<TagView[]>([]); |
| | | const iframeViews = ref<RouteLocationNormalized[]>([]); |
| | | |
| | | const addView = (view: TagView) => { |
| | | const getVisitedViews = (): RouteLocationNormalized[] => { |
| | | return visitedViews.value; |
| | | }; |
| | | const getIframeViews = (): RouteLocationNormalized[] => { |
| | | return iframeViews.value; |
| | | }; |
| | | const getCachedViews = (): string[] => { |
| | | return cachedViews.value; |
| | | }; |
| | | |
| | | const addView = (view: RouteLocationNormalized) => { |
| | | addVisitedView(view); |
| | | addCachedView(view); |
| | | }; |
| | | |
| | | const addIframeView = (view: TagView): void => { |
| | | if (iframeViews.value.some((v: TagView) => v.path === view.path)) return; |
| | | const addIframeView = (view: RouteLocationNormalized): void => { |
| | | if (iframeViews.value.some((v: RouteLocationNormalized) => v.path === view.path)) return; |
| | | iframeViews.value.push( |
| | | Object.assign({}, view, { |
| | | title: view.meta?.title || 'no-name' |
| | | }) |
| | | ); |
| | | }; |
| | | const delIframeView = (view: TagView): Promise<TagView[]> => { |
| | | const delIframeView = (view: RouteLocationNormalized): Promise<RouteLocationNormalized[]> => { |
| | | return new Promise((resolve) => { |
| | | iframeViews.value = iframeViews.value.filter((item: TagView) => item.path !== view.path); |
| | | iframeViews.value = iframeViews.value.filter((item: RouteLocationNormalized) => item.path !== view.path); |
| | | resolve([...iframeViews.value]); |
| | | }); |
| | | }; |
| | | const addVisitedView = (view: TagView): void => { |
| | | if (visitedViews.value.some((v: TagView) => v.path === view.path)) return; |
| | | const addVisitedView = (view: RouteLocationNormalized): void => { |
| | | if (visitedViews.value.some((v: RouteLocationNormalized) => v.path === view.path)) return; |
| | | visitedViews.value.push( |
| | | Object.assign({}, view, { |
| | | title: view.meta?.title || 'no-name' |
| | | }) |
| | | ); |
| | | }; |
| | | const delView = (view: TagView): Promise<{ visitedViews: TagView[]; cachedViews: string[] }> => { |
| | | const delView = ( |
| | | view: RouteLocationNormalized |
| | | ): Promise<{ |
| | | visitedViews: RouteLocationNormalized[]; |
| | | cachedViews: string[]; |
| | | }> => { |
| | | return new Promise((resolve) => { |
| | | delVisitedView(view); |
| | | if (!isDynamicRoute(view)) { |
| | |
| | | }); |
| | | }; |
| | | |
| | | const delVisitedView = (view: TagView): Promise<TagView[]> => { |
| | | const delVisitedView = (view: RouteLocationNormalized): Promise<RouteLocationNormalized[]> => { |
| | | return new Promise((resolve) => { |
| | | for (const [i, v] of visitedViews.value.entries()) { |
| | | if (v.path === view.path) { |
| | |
| | | resolve([...visitedViews.value]); |
| | | }); |
| | | }; |
| | | const delCachedView = (view?: TagView): Promise<string[]> => { |
| | | const delCachedView = (view?: RouteLocationNormalized): Promise<string[]> => { |
| | | let viewName = ''; |
| | | if (view) { |
| | | viewName = view.name as string; |
| | |
| | | resolve([...cachedViews.value]); |
| | | }); |
| | | }; |
| | | const delOthersViews = (view: TagView): Promise<{ visitedViews: TagView[]; cachedViews: string[] }> => { |
| | | const delOthersViews = ( |
| | | view: RouteLocationNormalized |
| | | ): Promise<{ |
| | | visitedViews: RouteLocationNormalized[]; |
| | | cachedViews: string[]; |
| | | }> => { |
| | | return new Promise((resolve) => { |
| | | delOthersVisitedViews(view); |
| | | delOthersCachedViews(view); |
| | |
| | | }); |
| | | }; |
| | | |
| | | const delOthersVisitedViews = (view: TagView): Promise<TagView[]> => { |
| | | const delOthersVisitedViews = (view: RouteLocationNormalized): Promise<RouteLocationNormalized[]> => { |
| | | return new Promise((resolve) => { |
| | | visitedViews.value = visitedViews.value.filter((v: TagView) => { |
| | | visitedViews.value = visitedViews.value.filter((v: RouteLocationNormalized) => { |
| | | return v.meta?.affix || v.path === view.path; |
| | | }); |
| | | resolve([...visitedViews.value]); |
| | | }); |
| | | }; |
| | | const delOthersCachedViews = (view: TagView): Promise<string[]> => { |
| | | const delOthersCachedViews = (view: RouteLocationNormalized): Promise<string[]> => { |
| | | const viewName = view.name as string; |
| | | return new Promise((resolve) => { |
| | | const index = cachedViews.value.indexOf(viewName); |
| | |
| | | }); |
| | | }; |
| | | |
| | | const delAllViews = (): Promise<{ visitedViews: TagView[]; cachedViews: string[] }> => { |
| | | const delAllViews = (): Promise<{ visitedViews: RouteLocationNormalized[]; cachedViews: string[] }> => { |
| | | return new Promise((resolve) => { |
| | | delAllVisitedViews(); |
| | | delAllCachedViews(); |
| | |
| | | }); |
| | | }); |
| | | }; |
| | | const delAllVisitedViews = (): Promise<TagView[]> => { |
| | | const delAllVisitedViews = (): Promise<RouteLocationNormalized[]> => { |
| | | return new Promise((resolve) => { |
| | | visitedViews.value = visitedViews.value.filter((tag: TagView) => tag.meta?.affix); |
| | | visitedViews.value = visitedViews.value.filter((tag: RouteLocationNormalized) => tag.meta?.affix); |
| | | resolve([...visitedViews.value]); |
| | | }); |
| | | }; |
| | |
| | | }); |
| | | }; |
| | | |
| | | const updateVisitedView = (view: TagView): void => { |
| | | const updateVisitedView = (view: RouteLocationNormalized): void => { |
| | | for (let v of visitedViews.value) { |
| | | if (v.path === view.path) { |
| | | v = Object.assign(v, view); |
| | |
| | | } |
| | | } |
| | | }; |
| | | const delRightTags = (view: TagView): Promise<TagView[]> => { |
| | | const delRightTags = (view: RouteLocationNormalized): Promise<RouteLocationNormalized[]> => { |
| | | return new Promise((resolve) => { |
| | | const index = visitedViews.value.findIndex((v: TagView) => v.path === view.path); |
| | | const index = visitedViews.value.findIndex((v: RouteLocationNormalized) => v.path === view.path); |
| | | if (index === -1) { |
| | | return; |
| | | } |
| | | visitedViews.value = visitedViews.value.filter((item: TagView, idx: number) => { |
| | | visitedViews.value = visitedViews.value.filter((item: RouteLocationNormalized, idx: number) => { |
| | | if (idx <= index || (item.meta && item.meta.affix)) { |
| | | return true; |
| | | } |
| | |
| | | resolve([...visitedViews.value]); |
| | | }); |
| | | }; |
| | | const delLeftTags = (view: TagView): Promise<TagView[]> => { |
| | | const delLeftTags = (view: RouteLocationNormalized): Promise<RouteLocationNormalized[]> => { |
| | | return new Promise((resolve) => { |
| | | const index = visitedViews.value.findIndex((v: TagView) => v.path === view.path); |
| | | const index = visitedViews.value.findIndex((v: RouteLocationNormalized) => v.path === view.path); |
| | | if (index === -1) { |
| | | return; |
| | | } |
| | | visitedViews.value = visitedViews.value.filter((item: TagView, idx: number) => { |
| | | visitedViews.value = visitedViews.value.filter((item: RouteLocationNormalized, idx: number) => { |
| | | if (idx >= index || (item.meta && item.meta.affix)) { |
| | | return true; |
| | | } |
| | |
| | | }); |
| | | }; |
| | | |
| | | const addCachedView = (view: TagView): void => { |
| | | const addCachedView = (view: RouteLocationNormalized): void => { |
| | | const viewName = view.name as string; |
| | | if (!viewName) return; |
| | | if (cachedViews.value.includes(viewName)) return; |
| | |
| | | } |
| | | }; |
| | | |
| | | const isDynamicRoute = (view: any): boolean => { |
| | | const isDynamicRoute = (view: RouteLocationNormalized): boolean => { |
| | | // 检查匹配的路由记录中是否有动态段 |
| | | return view.matched.some((m: RouteRecordNormalized) => m.path.includes(':')); |
| | | return view.matched.some((m) => m.path.includes(':')); |
| | | }; |
| | | |
| | | return { |
| | | visitedViews, |
| | | cachedViews, |
| | | iframeViews, |
| | | |
| | | getVisitedViews, |
| | | getIframeViews, |
| | | getCachedViews, |
| | | |
| | | addVisitedView, |
| | | addCachedView, |
| | | delVisitedView, |
| | |
| | | delIframeView |
| | | }; |
| | | }); |
| | | |
| | | export default useTagsViewStore; |