完整的导航解析流程

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)

Vue Router 路由守卫:完整的导航解析流程的更多相关文章

  1. Vue Router路由守卫妙用:异步获取数据成功后再进行路由跳转并传递数据,失败则不进行跳转

    问题引入 试想这样一个业务场景: 在用户输入数据,点击提交按钮后,这时发起了ajax请求,如果请求成功, 则跳转到详情页面并展示详情数据,失败则不跳转到详情页面,只是在当前页面给出错误消息. 难点所在 ...

  2. Vue 路由导航解析流程

    Vue Router完整的导航解析流程

  3. 前端MVC Vue2学习总结(八)——Vue Router路由、Vuex状态管理、Element-UI

    一.Vue Router路由 二.Vuex状态管理 三.Element-UI Element-UI是饿了么前端团队推出的一款基于Vue.js 2.0 的桌面端UI框架,手机端有对应框架是 Mint U ...

  4. Vue的路由动态重定向和导航守卫

    一.重定向 重定向也是通过 routes 配置来完成,下面例子是从 /a 重定向到 /b: const router = new VueRouter({ routes: [ { path: '/a', ...

  5. Vue系列:Vue Router 路由梳理

    Vue Router 是 Vue.js 官方的路由管理器.它和 Vue.js 的核心深度集成,让构建单页面应用变得易如反掌.包含的功能有: 嵌套的路由/视图表 模块化的.基于组件的路由配置 路由参数. ...

  6. Vue Router 路由实现原理

    一.概念 通过改变 URL,在不重新请求页面的情况下,更新页面视图. 二.实现方式 更新视图但不重新请求页面,是前端路由原理的核心之一,目前在浏览器环境中这一功能的实现主要有2种方式: 1.Hash  ...

  7. Vue Router路由管理器介绍

    参考博客:https://www.cnblogs.com/avon/p/5943008.html 安装介绍:Vue Router 版本说明 对于 TypeScript 用户来说,vue-router@ ...

  8. vue全局路由守卫beforeEach+token验证+node

    在后端安装jsonwebtoken         npm i jsonwebtoken --save 在 login.js文件中引入      // 引入jwtconst jwt = require ...

  9. 04 Vue Router路由管理器

    路由的基本概念与原理 Vue Router Vue Router (官网: https://router.vuejs.org/zh/)是Vue.js 官方的路由管理器. 它和vue.js的核心深度集成 ...

随机推荐

  1. php设置错误级别

    ini_set('display_errors', 1); error_reporting(E_ALL);

  2. mysql随机取一条记录

    function getTodayLook($limit) { $sql = "select * from `tvhome_movie_today` order by rand() limi ...

  3. verilog版插值

      开发环境:IDE:LIBERO 9.0(ACTEL公司的)芯片:AFS600 (BGA256),是混合系列的FPGA仿真软件:modelsim atcel 6.5d综合软件:synplify pr ...

  4. Linux shell 批量验证端口连通性

    工作中会遇到验证到某某服务器端口是否连通,如果IP或端口多时,用shell还是很省时省力的,看下面的脚本: #!/bin/bash # #database check #set -o nounset ...

  5. CPU指令重排序与MESI缓存一致性

    一.重排序场景 class ResortDemo { int a = 0; boolean flag = false; public void writer() { a = 1; //1 flag = ...

  6. vim小白练习记录

    1.vim卡死  按ctrl+s键后 vim卡死,按任何键不管用,按ctrl+q恢复

  7. 做股票软件用的各种k线图

    这是各种k线图地址: http://echarts.baidu.com/echarts2/doc/example.html 个人公众号谢谢各位老铁支持 本人qq群也有许多的技术文档,希望可以为你提供一 ...

  8. 关于在IOS中 contenteditable=true 无法输入的问题

    解决: 1.添加样式-webkit-user-select:text 2.如果引入了fastclick,需要添加个类名 needsclick 来源于知乎(https://www.zhihu.com/q ...

  9. Java课程作业02

    01. 一.设计思想: 第一种使用n!的公式直接计算,利用递归方法求n! 第二种使用递推的公式,利用递归返回求和. 二.程序流程图 三.源代码 import java.util.*;import ja ...

  10. LeetCode--098--验证搜索二叉树(python)

    给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数.节点的右子树只包含大于当前节点的数.所有左子树和右子树自身必须也是二叉搜索树. ...