gpt4 book ai didi

javascript - 在 guard 中检测导航中止/取消

转载 作者:行者123 更新时间:2023-12-05 00:37:18 25 4
gpt4 key购买 nike

目前预计导航已确认,所以beforeEachafterEach全局守卫被触发。 showSpinnerhideSpinner应该在每个导航上成对调用。

router.beforeEach((to, from, next) => {
showSpinner();
next();
}

router.afterEach((to, from) => {
// This line can be never called
hideSpinner();
});
据我所知,导航结果无法通过 next 获得在 guard 。
然后在另一个地方导航被取消了,所以它停留在之前的路线上, afterEach未触发(同样可能适用于导航中止):
beforeRouteEnter() {
...
next(false);
}
结果是 afterEachhideSpinner没有被触发。
Vue Router 3.4.9 和 Vue 2.6 会发生这种情况。
如何解决?

最佳答案

似乎没有内置方法可以从取消的导航中获取中止事件。
然而,深入研究 vue-router的代码我发现每一个到路由的转换都是在 router.history 中处理的。通过 transitionTo函数接受作为第三个参数的 abort 函数,该函数在导航未被确认时调用。可以通过覆盖此函数来拦截该事件。
我确信这段代码会受到一些批评,但它可能会在这里提出一些想法。

const transitionTo = Object.getPrototypeOf(router.history).transitionTo;

Object.getPrototypeOf(router.history).transitionTo = function (...args) {
const abortFn = args[2] && new Function("return " + args[2].toString());
args[2] = (err) => {
// eventBus.$emit("hide-spinner"); // or any other method to hide the spinner
console.log("Aborted", err);
abortFn && abortFn(err);
};
transitionTo.apply(router.history, args);
};
这是一个有效的 codesandbox

关于javascript - 在 guard 中检测导航中止/取消,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68631435/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com