【问题标题】:vue-router - how to abort route change in beforeRouteEntervue-router - 如何中止 beforeRouteEnter 中的路由更改
【发布时间】:2018-03-06 21:40:16
【问题描述】:

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

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);
    }
  });
},

我的想法是我测试道具是否存在,如果它无效,则返回(或以其他方式中止路线更改)。但是,从控制台日志中,我可以看到正在发生的事情是组件实例实际上正在创建,可能是由于调用回调并引发了一堆错误,然后 vm.$router.go(-1) 开始并将用户带回到上一个屏幕。

那么,如果有一个必要条件不存在,如果到我可以测试它的时候为时已晚,我该怎么做才能真正阻止路线更改完成?

【问题讨论】:

    标签: vue.js vue-router


    【解决方案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阅读更多关于这个守卫的信息

    【讨论】:

    • 这与我现在所拥有的几乎相同(并导致相同的错误)。组件实例显然是在 if (!vm.product) 测试完成之前创建的,可能是由于调用了 next(vm => 。
    • 你尝试vm.$props.product(道具中的产品)还是vm.$data.product(数据中的产品)
    • 这给了我:“TypeError: vm.$props is undefined”
    • 我现在相信我无法使用 beforeRouteEnter 做我想做的事。这来自文档:“确认导航后将调用回调”。到那时,为时已晚。因此,如果数据无效,我需要找到其他方法来中止路由更改。
    • 其实这只是给了我一个想法。我已将next(vm => { ... }); 块包装在try/catch 中,并将next(from) 放入catch 块中。因此,如果出现错误,无论如何它都应该重定向。我会看看这是怎么回事。
    猜你喜欢
    • 2019-09-06
    • 2021-02-06
    • 1970-01-01
    • 1970-01-01
    • 2017-06-01
    • 2018-02-17
    • 2018-12-28
    • 2016-09-05
    • 2020-08-22
    相关资源
    最近更新 更多