完整的导航解析流程

1 导航被触发。

2 在失活的组件里调用离开守卫。

3 调用全局的 beforeEach 守卫。

4 在重用的组件里调用 beforeRouteUpdate 守卫 (2.2+)。

5 在路由配置里调用 beforeEnter

6 解析异步路由组件。

7 在被激活的组件里调用 beforeRouteEnter

8 调用全局的 beforeResolve 守卫 (2.5+)。

9 导航被确认。

10 调用全局的 afterEach 钩子。

11 触发 DOM 更新。

12 用创建好的实例调用 beforeRouteEnter 守卫中传给 next 的回调函数。

一 项目结构

二 main.js

import Vue from "vue";
import App from "./App.vue";
import router from "./router";
import store from "./store/index"; Vue.config.productionTip = false; new Vue({
router,
store,
render: h => h(App)
}).$mount("#app");

三 App.vue

<template>
<div id="app">
<h3>App组件</h3>
<hr/>
<router-view />
</div>
</template> <script>
export default {};
</script> <style lang="scss">
.link {
margin-right: 10px;
}
</style>

四 router.js

import Vue from "vue";
import Router from "vue-router";
import Home from "./views/Home.vue";
import User from "./components/User.vue"; Vue.use(Router); const router = new Router({
mode: "hash",
base: process.env.BASE_URL,
routes: [
{
path: "/",
name: "home",
component: Home,
beforeEnter(to, from, next) {
console.log("首页路由独享的守卫:beforeEnter");
next();
}
},
{
path: "/user/:id",
name: "user",
component: User,
props: true,
beforeEnter(to, from, next) {
console.log("用户路由独享的守卫:beforeEnter");
next(vm => {
console.log("首页路由独享守卫回调函数");
});
}
}
]
}); router.beforeEach((to, from, next) => {
console.log("全局前置守卫");
next();
}); router.beforeResolve((to, from, next) => {
console.log("全局解析守卫");
next();
}); router.afterEach((to, from) => {
console.log("全局后置钩子");
}); export default router;

五 Home.vue

<template>
<div class="home">
<h3>首页</h3>
<router-link to="/user/tom" class="link">汤姆</router-link>
<router-link to="/user/jack" class="link">杰克</router-link>
</div>
</template> <script>
export default {
name: "home",
beforeRouteEnter(to, from, next) {
console.log("首页组件内的守卫:beforeRouteEnter");
next(vm => {
console.log("首页组件内的守卫:beforeRouteEnter:回调函数");
});
},
beforeRouteUpdate(to, from, next) {
console.log("首页组件内的守卫:beforeRouteUpdate");
next();
},
beforeRouteLeave(to, from, next) {
console.log("首页组件内的守卫:beforeRouteLeave");
const answer = window.confirm(
"Do you really want to leave? you have unsaved changes!"
);
if (answer) {
next();
} else {
next(false);
}
}
};
</script>

六 User.vue

<template>
<div>
<h4>{{id}}</h4>
<button @click="$router.back()" class="link">首页</button>
<router-link to="/user/tom" class="link">汤姆</router-link>
<router-link to="/user/jack" class="link">杰克</router-link>
</div>
</template> <script>
export default {
name: "user",
props: ["id"],
beforeRouteEnter(to, from, next) {
console.log("用户组件内的守卫:beforeRouteEnter");
next(vm => {
console.log("用户组件内的守卫:beforeRouteEnter:回调函数");
});
},
beforeRouteUpdate(to, from, next) {
console.log("用户组件内的守卫:beforeRouteUpdate");
next();
},
beforeRouteLeave(to, from, next) {
console.log("用户组件内的守卫:beforeRouteUpdate");
const answer = window.confirm(
"Do you really want to leave? you have unsaved changes!"
);
if (answer) {
next();
} else {
next(false);
}
}
};
</script>

七 运行效果

进入首页

从首页进入用户页面(tom)

从用户页面(tom)进入用户页面(jack)

最新文章

  1. javascript浏览器检测
  2. ZK 样式使用
  3. .NET分布式事务处理
  4. LeetCode_3 sum
  5. MySql按日期时间段进行统计(前一天、本周、某一天、某个时间段)
  6. 不常见但很有用的chrome调试工具使用方法
  7. java语言中的匿名类与lambda表达式介绍与总结 (Anonymous Classes and Lambda Expressions)
  8. Asp.net 不安全端口 解决chrome浏览器访问时提示:ERR_UNSAFE_PORT
  9. hiveserver2启动成功但无法通过beeline连接
  10. Arrays和String单元测试
  11. CSS中float属性
  12. 【BZOJ1452】【JSOI2009】count
  13. grub的boot loader安装在磁盘上的位置
  14. PHP数组基本的操作方法
  15. 常用DB2命令
  16. 一步一步写数据结构(BST-二叉排序树)
  17. PHP爬取知乎日报图片显示不了问题
  18. N个点中寻找多个最近两点的计算O(N²)
  19. Linux上安装MySQL - 12条命令搞定MySql
  20. Android学习笔记_37_ListView批量加载数据和页脚设置

热门文章

  1. grep 文本过滤
  2. Intelli IDEA快捷键(配合IdeaVim)(转)
  3. LOJ 6192 城市网络(树上倍增)
  4. Zookeeper学习笔记(中)
  5. 洛谷P3768 简单的数学题 莫比乌斯反演+杜教筛
  6. hive group by distinct区别以及性能比较
  7. 【BZOJ3601】一个人的数论
  8. 【leetcode】1095. Find in Mountain Array
  9. 部署至Oracle数据库的注意事项
  10. 解决Intellij IDEA中项目不能识别yml配置文件