Vue.js 和 Vue-router 在生命周期钩子中的优先级

Precedence in lifecycle hooks with Vue.js and Vue-router

我正在使用 vuevue-router 构建应用程序。在某些路由中,我需要先检查一些条件,如果不满足这些条件,然后重定向到另一个组件,所以我在我的组件的 router 选项上使用了 activate 钩子,并且它有效美好的。此外,在同一组件内,我有 vue created 挂钩来加载一些数据,问题是如果不满足我之前提到的那些条件,那么我无法在创建的挂钩中加载数据。我期望的是,如果不满足该条件,并且调用了重定向钩子,那么创建的钩子将不会被触发,但实际发生的是当该条件为假时,激活钩子的重定向被调用还有 从 Vue 创建的钩子。因此,除了针对我的特定用例的解决方案之外,我还想知道同时使用 vue 和 vue 路由器时挂钩的执行顺序。

为什么不为每个添加控制台日志并亲自查看?

据我所知,无需测试:

  1. 可以重复使用
  2. 可以激活

-- 现在正在创建组件实例:

  1. 已创建
  2. 编译前
  3. 已编译

--(不确定是先准备好还是激活,但我猜准备好了)

  1. 准备就绪
  2. 激活
  3. 数据

对于您的特定情况,数据获取应该发生在数据挂钩中 - 毕竟这就是它的用途。

对于 Vue 2.0:

  1. 创建前
  2. 已创建
  3. 挂载前
  4. 挂载
  5. 更新前
  6. 已更新
  7. 毁灭前
  8. 摧毁

现在使用 vue-router 2.0 时,可以在两个地方获取数据,根据他们的 doc:

Fetching After Navigation: perform the navigation first, and fetch data in the incoming component's lifecycle hook. Display a loading state while data is being fetched.

Fetching Before Navigation: Fetch data before navigation in the route enter guard, and perform the navigation after data has been fetched.

对于您的情况,您可以在函数中编写数据获取逻辑,并在组件生命周期的 "created" 挂钩中调用它。如果数据随着路由发生变化,那么在 $route 对象上写一个 watcher,这将触发你的数据获取功能。

由于 vue-router 0.7 的数据挂钩已被弃用,$route 对象已变为反应式。阅读更多 here.

也许您对In-Component Guards(在使用 Vue Router 加载的组件中可用的附加钩子)

感兴趣
const Foo = {
  template: `...`,
  beforeRouteEnter (to, from, next) {
    // called before the route that renders this component is confirmed.
    // does NOT have access to `this` component instance,
    // because it has not been created yet when this guard is called!
  },
  beforeRouteUpdate (to, from, next) {
    // called when the route that renders this component has changed,
    // but this component is reused in the new route.
    // For example, for a route with dynamic params `/foo/:id`, when we
    // navigate between `/foo/1` and `/foo/2`, the same `Foo` component instance
    // will be reused, and this hook will be called when that happens.
    // has access to `this` component instance.
  },
  beforeRouteLeave (to, from, next) {
    // called when the route that renders this component is about to
    // be navigated away from.
    // has access to `this` component instance.
  }
}

https://router.vuejs.org/guide/advanced/navigation-guards.html#in-component-guards

如果你使用 Vue + Vue Router 并且你在 RouteA 并从它导航到 RouteB 并且每个 route/component 在 "created" 上注册一些东西(例如接收根支持的数据)并注销"beforeDestroy" 但是当你离开 RouteA 时它的 "beforeDestroy" 在 RouteB "created" 之后被调用所以你没有注册!我已经测试过了,VUE 1 的顺序是正确的。它必须在 VUE 2 + VUE Router 2 的某处更改。

Correct/expected 从 RouteA 到 RouteB 时挂钩 VUE 1 中的顺序:

  • RouteA beforeDestroy
  • 已创建 RouteB

Incorrect/unexpected 从 RouteA 到 RouteB 时挂钩 VUE 2 中的顺序:

  • 已创建 RouteB
  • RouteA beforeDestroy

解决方案是使用 "created" + "beforeRouteLeave" for VUE 2 + VUE Router 2。