vue.js - vue-router - 如何在 beforeRouteEnter 中中止路由更改

标签 vue.js vue-router

我在 vue.js/vue-router 的 beforeRouteEnter 导航守卫中看到了一些我不理解的行为。我从文档中了解到,这个守卫“无法访问 this 组件实例”,但是如果您需要访问组件实例,您可以通过回调来实现。我这样做是因为如果其中一个 Prop 尚未定义(通常是因为用户单击前进按钮),我想中止路线更改。这就是我所拥有的:

beforeRouteEnter(to, from, next) {
  console.log("ProductDetail: routing from = "+from.path+" to "+to.path);

  next(vm => {
    if (!vm.product) {
      console.log("Product empty: routing back one page");
      vm.$router.go(-1);
    }
  });
},

这个想法是我测试 Prop 是否存在,如果它无效,则返回(或以其他方式中止路线更改)。从控制台日志中,我可以看到正在发生的情况是,组件实例实际上正在创建,大概是由于调用了回调,并在 vm.$router.go(-1) 之前抛出了一堆错误。启动并将用户带回到上一个屏幕。

那么,如果不存在必要条件之一,并且在我测试它时为时已晚,我可以采取什么措施来真正阻止路线更改完成?

最佳答案

您可以尝试此代码

beforeRouteEnter(to, from, next) {
  // Your code
  next(vm => {
    if (!vm.product) {
      console.log("Product empty: routing back one page");
      next(from)
    }
  });
}

您可以在https://router.vuejs.org/en/advanced/navigation-guards.html中阅读有关此守卫的更多信息。

关于vue.js - vue-router - 如何在 beforeRouteEnter 中中止路由更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46413335/

相关文章:

javascript - Vue v-model 不会触发第三方下拉菜单

javascript - 如何在 bootstrap vue 中使用 Form Tags 组件时将对象用作标签

vue.js - Bundle size 很大,如何减小 app.js 的大小?

laravel - vue 文件中的更改不适用于浏览器

javascript - 将 Material 设计与 VueJS 结合使用

javascript - 仅使用 NUXT.js 生成静态 html

vuejs2 - 禁用基于 bool 值的nuxt链接

vue.js - 使用 Vue.JS 时,我们是否被迫在我们的 CSP 中使用 'unsafe-inline'?

jquery - 克隆的路由器链接应该加载到子路由器 View 上,但它也会重新加载主路由器 View

javascript - 如何将应用程序数据传递到 VueRouter 组件