学习 vue-router 完整的导航解析流程
路由导航分类
vue 中导航的解析流程如下所示:
- 1.导航被触发。
- 2.在失活的组件里调用离开守卫。
- 3.调用全局的
beforeEach
守卫。
- 4.在
重用的组件
里调用 beforeRouteUpdate
守卫(2.2+)。
- 5.在路由配置里调用
beforeEnter
。
- 6.解析异步路由组件。
- 7.在被激活的组件里面调用
beforeRouterEnter
。
- 8.调用全局的
beforeResolve
守卫(2.5+)。
- 9.导航被确认。
- 10.调用全局的
afterEach
钩子。
- 11.触发
DOM
更新。
- 12.用创建好的实例调用
beforeRouteEnter
守卫中传给 next
的回调函数。
全局导航守卫/路由独享的守卫
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
|
import Vue from "vue"; import Router from "vue-router";
Vue.use(Router);
const router = new Router({ routes: [ { path: "/foo", component: Foo, beforeEnter: (to, from, next) => { } } ] });
router.beforeEach((to, from, next) => {
next(); });
router.beforeResolve((to, from, next) => { next(); });
router.afterEach((to, from) => {
});
export default router;
|
组件内的守卫
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
|
export default { beforeRouteEnter(to, from, next) { }, beforeRouteUpdate(to, from, next) { }, beforeRouteLeave(to, from, next) { const answer = window.confirm( "Do you really want to leave? you have unsaved changes!" ); if (answer) { next(); } else { next(false); } } };
|
如何解决路由参数或查询的改变并不会触发进入/离开的导航守卫?
通过 watch 观察 $route
1 2 3 4 5 6 7 8
| export default { watch: { $route(to, from) { } } };
|
使用 beforeRouteUpdate
组件级守卫
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
export default { beforeRouteUpdate(to, from, next) { next(); } };
|
参考文档:
https://router.vuejs.org/zh/guide/advanced/navigation-guards.html