diff --git a/package.json b/package.json index 07b231da..e9ea3a1a 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,7 @@ "element-plus": "2.3.9", "js-cookie": "3.0.5", "lodash-es": "4.17.21", + "mitt": "3.0.1", "normalize.css": "8.0.1", "nprogress": "0.2.0", "path-browserify": "1.0.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e3107f67..70ebb4e1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -23,6 +23,9 @@ dependencies: lodash-es: specifier: 4.17.21 version: 4.17.21 + mitt: + specifier: 3.0.1 + version: 3.0.1 normalize.css: specifier: 8.0.1 version: 8.0.1 @@ -3777,6 +3780,10 @@ packages: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} dev: true + /mitt@3.0.1: + resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} + dev: false + /mixin-deep@1.3.2: resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} engines: {node: '>=0.10.0'} diff --git a/src/layouts/components/TagsView/index.vue b/src/layouts/components/TagsView/index.vue index 5843bda8..aeda6436 100644 --- a/src/layouts/components/TagsView/index.vue +++ b/src/layouts/components/TagsView/index.vue @@ -1,10 +1,11 @@ diff --git a/src/router/permission.ts b/src/router/permission.ts index 22c9ad63..25d84925 100644 --- a/src/router/permission.ts +++ b/src/router/permission.ts @@ -4,6 +4,7 @@ import { usePermissionStoreHook } from "@/store/modules/permission" import { ElMessage } from "element-plus" import { getToken } from "@/utils/cache/cookies" import { fixBlankPage } from "@/utils/fix-blank-page" +import { setRouteEmitter } from "@/utils/route-listener" import routeSettings from "@/config/route" import isWhiteList from "@/config/white-list" import NProgress from "nprogress" @@ -13,6 +14,7 @@ NProgress.configure({ showSpinner: false }) router.beforeEach(async (to, _from, next) => { fixBlankPage() + setRouteEmitter(to) NProgress.start() const userStore = useUserStoreHook() const permissionStore = usePermissionStoreHook() diff --git a/src/utils/route-listener.ts b/src/utils/route-listener.ts new file mode 100644 index 00000000..f8e82ea9 --- /dev/null +++ b/src/utils/route-listener.ts @@ -0,0 +1,28 @@ +/** 单独监听路由会浪费渲染性能,使用发布订阅模式去进行分发管理 */ + +import mitt, { type Handler } from "mitt" +import { type RouteLocationNormalized } from "vue-router" + +/** 回调函数的类型 */ +type Callback = (route: RouteLocationNormalized) => void + +const emitter = mitt() +const key = Symbol("ROUTE_CHANGE") +let latestRoute: RouteLocationNormalized + +/** 设置最新的路由信息 */ +export const setRouteEmitter = (to: RouteLocationNormalized) => { + emitter.emit(key, to) + latestRoute = to +} + +/** 设置路由变化时的回调函数(可以选择立即执行一次回调函数) */ +export const listenerRouteChange = (callback: Callback, immediate = false) => { + emitter.on(key, callback as Handler) + immediate && latestRoute && callback(latestRoute) +} + +/** 移除路由变化事件监听器 */ +export const removeRouteListener = () => { + emitter.off(key) +}