Vue Router 路由守卫:完整的导航解析流程

完整的导航解析流程

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)

原文地址:https://www.cnblogs.com/sea-breeze/p/11326460.html

时间: 2024-10-06 12:45:16

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

Vue系列:Vue Router 路由梳理

Vue Router 是 Vue.js 官方的路由管理器.它和 Vue.js 的核心深度集成,让构建单页面应用变得易如反掌.包含的功能有: 嵌套的路由/视图表 模块化的.基于组件的路由配置 路由参数.查询.通配符 基于 Vue.js 过渡系统的视图过渡效果 细粒度的导航控制 带有自动激活的 CSS class 的链接 HTML5 历史模式或 hash 模式,在 IE9 中自动降级 自定义的滚动条行为 1.动态路由 动态路由,可以将某种模式匹配到的所有路由,并全都映射到同个组件. (通俗点,比如根

Vue Router 路由实现原理实现原理

一.概念 通过改变 URL,在不重新请求页面的情况下,更新页面视图. 二.实现方式 更新视图但不重新请求页面,是前端路由原理的核心之一,目前在浏览器环境中这一功能的实现主要有2种方式: 1.Hash --- 利用 URL 中的hash("#"); 2.利用 History interface 在HTML5中新增的方法. Vue 中,它是通过 mode 这一参数控制路由的实现模式: const router=new VueRouter({ mode:'history', routes:[

04 Vue Router路由管理器

路由的基本概念与原理 Vue Router Vue Router (官网: https://router.vuejs.org/zh/)是Vue.js 官方的路由管理器. 它和vue.js的核心深度集成,可以非常方便的用于SPA应用程序的开发. Vue Router包含的功能有: 支持HTML5 历史模式或hash模式 支持嵌套路由 支持路由参数 支持编程式路由 支持命名路由 vue-router的基本使用 基本使用步骤 1.引入相关的库文件 导入vue文件为全局window对象挂载Vue构造函数

vue router路由(三)

当环境搭建及Vue语法与指令都有所了解,该说下router. build目录是打包配置文件 (不建议动) config是vue项目基本配置文件 dist是构建后文件 js 手动创建 (根据需要) node_modules 根据package.json 安装依赖模块 src资源文件,基本文件都会放在这里 app.vue  父组件 main.js 入口文件 static构建好的文件会在这个目录 index.html 主页 1.首先安装路由通过npm: npm install vue-router 在

Vue Router 路由懒加载

将异步组件定义为一个返回Promise 的工厂函数. 函数样式的import()语法,是JavaScript新增加的模块加载语法,提案正处于TC39委员会的第四阶段.它返回一个Promise. 一 路由配置 import Vue from "vue"; import Router from "vue-router"; const Home = () => import(/*webpackChunkName:"home"*/ "./

vue router 路由的学习

新建vue项目的时候 你会发现有个文件夹叫router 这个文件夹下你可以设置一个index.js但是需要引入的两个包 import Vue from 'vue' import Router from 'vue-router' Vue.use(Router) 注册路由组件 export default new Router 默认加载这个路由 routes: [] 内部可以写你要配置的路由路径 path: '/' //配置地址 多数用来跳转的地址 nam: 'bac'// 一般用来路由跳转this

&lt;keep-alive&gt;控制Vue Router路由

只给部分组件加上<keep-alive>啊,在app.vue里这样 <!-- 这里是需要keepalive的 --> <keep-alive> <router-view v-if="$route.meta.keepAlive"></router-view> </keep-alive> <!-- 这里不会被keepalive --> <router-view v-if="!$route.m

vue全局路由守卫

在main.js里使用方法 router.beforeEach((to,from,next)=>{}) to,是将要跳转的路由, from,是上一个路由 next是个方法,判断to.path 或者 from.path ,如果符合条件,则允许跳转 例子: main.js router.beforeEach((to,from,next)=>{ if(to.path==="/about"){ alert("登陆后方可查看") }else{ next(); }

八、Vue Router 进阶-导航守卫

导航守卫 所谓的导航守卫,就是路由的钩子函数.主要用来通过跳转或取消导航.导航守卫分三种:全局.路由独享.组件级的. 注意:参数或查询的改变并不会触发进入和离开的导航守卫.可以通过watch监听$route对象,或使用beforeRouteUpdate的组件内守卫. 全局前置守卫 进入路由之前的钩子函数,接受next函数,在此可以阻止进入路由或跳转到指定路由. <script> const router = new VueRouter({ ... }); // 接收三个参数:to为目标路由对象