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

标签 javascript vue.js vue-router

目前预计导航已确认,所以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/

相关文章:

javascript - 无法读取未定义的Vue js的属性 '_router'

css - Vuetify v-select 组件宽度改变

vue.js - 仅在按下按键时处理 VueJS 事件

javascript - 如何在 <template> 之前加载 Vuejs 单文件组件的 &lt;script&gt; 部分

javascript - 在php中提交html表单

json - 如何使用 JSON 动态更改组件的内容?

javascript - 如何向 Vue 路由器路径添加 float 验证?

javascript - 仅在手动刷新后显示页面(React)

javascript - KineticJS 未捕获类型错误 : Object #<Object> has no method 'drawScene'

javascript - 使用javascript删除对象