/**
|
* Listening to routes alone would waste rendering performance. Use the publish-subscribe model for distribution management
|
* 单独监听路由会浪费渲染性能。使用发布订阅模式去进行分发管理。
|
*/
|
import mitt, { Handler } from 'mitt';
|
import type { RouteLocationNormalized } from 'vue-router';
|
|
const emitter = mitt();
|
|
const key = Symbol('ROUTE_CHANGE');
|
|
let latestRoute: RouteLocationNormalized;
|
|
export function setRouteEmitter(to: RouteLocationNormalized) {
|
emitter.emit(key, to);
|
latestRoute = to;
|
}
|
|
export function listenerRouteChange(
|
handler: (route: RouteLocationNormalized) => void,
|
immediate = true
|
) {
|
emitter.on(key, handler as Handler);
|
if (immediate && latestRoute) {
|
handler(latestRoute);
|
}
|
}
|
|
export function removeRouteListener() {
|
emitter.off(key);
|
}
|