一、导航守卫

经常在项目中,会对页面做一些权限控制,所以需要对路由变化做出处理,跳转或取消相应的路由。

导航:即路由发生变化。导航守卫即对路由变化做出处理。当然也分几种情况:对全局变化做处理、对“单个路由独享”变化做处理、对组件级(即具体的某个组件内部)变化做处理。

特别注意点:当参数或者查询发生变化的时候,并不会触发进入/离开的导航路由。这个可以参考上一篇博客的“响应路由参数的变化”,来监听$route对象或者使用beforeRouteUpdate的组件内守卫。

(一)对全局变化做处理的守卫

1.全局前置守卫(route.beforeEach)

首先可以使用route.beforeEach()来注册一个全局前置守卫。

var router = new VueRouter({
...//
})
router.beforeEach((to,from,next) => { })

下面解释下beforeEach方法的参数,之前在看Vue-router的时候,自己没有亲身实践过,对其中的参数含义理解模糊,果然还是需要实际操作才会记得住。

  • to:这是即将要进入的某个路由对象
  • from:指的是即将离开的某个路由对象
  • next:这是必须的,因为如果没有它,那么路由会停滞在当前页面,不会往后执行并变化相应的路由。

    next():指的是进入即将要进入的某个路由对象;next(false):指的是中断当前路由,重置回from的路由对象的url;next('/')或者next({path: '/'})指的是跳转至另一个想要进入的路由地址或者路由对象。

2.全局解析守卫(route.beforeResolve((to,from,next) => {}))

这是另一个类似于route.beforeEach的全局守卫方法。区别在于它会在导航被确认之前,同时在所有组件内守卫和异步路由组件被解析之后,解析守卫就被调用。

3.全局后置钩子(route.afterEach((to,from) => {}))

这个导航守卫的参数虽然没有next,指的是不会改变导航本身。进入路由之后调用。

(二)对“单个路由独享”变化做处理的守卫

1.可以直接在路由配置上定义beforeEnter守卫

const router = new VueRouter({
routes: [
{
path: 'foo',
component: Foo,
beforeEnter: (to,from,next) => {
...//
}
}
]
})

beforeEnter守卫的参数与beforeEach守卫的参数一致。

(三)对组件级变化做处理

面向于组件级,指的就是在组件内部使用的守卫方法,主要有beforeRouteEnter,beforeRouteUpdate,beforeRouteLeave三个方法。这三个方法的使用场景如下。

  • beforeRouteEnter:顾名思义,在route进入之前进行调用,一般是对权限做控制。
  • beforeRouteUpdate:指的是路由在变化的时候,既然是组件内部,那么就是针对于多个路由映射同一个组件的情况,就是params发生变化,例如/foo/1变化为/foo/2
  • beforeRouteLeave:指的是离开某个路由之前,通常应用在禁止用户离开页面,或者用户在未保存时提示用户等。
const Foo = {
template: `...`,
beforeRouteEnter (to, from, next) {
// 在渲染该组件的对应路由被 confirm 前调用
// 不!能!获取组件实例 `this`
// 因为当守卫执行前,组件实例还没被创建
},
beforeRouteUpdate (to, from, next) {
// 在当前路由改变,但是该组件被复用时调用
// 举例来说,对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候,
// 由于会渲染同样的 Foo 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用。
// 可以访问组件实例 `this`
},
beforeRouteLeave (to, from, next) {
// 导航离开该组件的对应路由时调用
// 可以访问组件实例 `this`
}
}

注意:虽然beforeRouteEnter,不能访问实例this

Vue-router浅析(二)的更多相关文章

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

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

  2. [Vue 牛刀小试]:第十二章 - 使用 Vue Router 实现 Vue 中的前端路由控制

    一.前言 前端路由是什么?如果你之前从事的是后端的工作,或者虽然有接触前端,但是并没有使用到单页面应用的话,这个概念对你来说还是会很陌生的.那么,为什么会在单页面应用中存在这么一个概念,以及,前端路由 ...

  3. Vue小项目二手书商城:(五)参考资料

    本项目基于vue2.5.2,如有错误,望指正. 完整程序:https://github.com/M-M-Monica/bukesi Vue.js官方文档:https://cn.vuejs.org/v2 ...

  4. Vue小项目二手书商城:(一)准备工作、组件和路由

    本项目基于vue2.5.2,与低版本部分不同之处会在(五)参考资料中提出 完整程序:https://github.com/M-M-Monica/bukesi 实现内容: 资源准备(mock数据) 组件 ...

  5. Vue Router学习笔记

    前端的路由:一个地址对应一个组件 Vue Router中文文档 一.路由基本使用 第1步:导入Vue Router: <script src="https://unpkg.com/vu ...

  6. 深入浅出的webpack构建工具--webpack4+vue+router项目架构(十四)

    阅读目录 一:vue-router是什么? 二:vue-router的实现原理 三:vue-router使用及代码配置 四:理解vue设置路由导航的两种方法. 五:理解动态路由和命名视图 六:理解嵌套 ...

  7. python 全栈开发,Day91(Vue实例的生命周期,组件间通信之中央事件总线bus,Vue Router,vue-cli 工具)

    昨日内容回顾 0. 组件注意事项!!! data属性必须是一个函数! 1. 注册全局组件 Vue.component('组件名',{ template: `` }) var app = new Vue ...

  8. Vue Router的懒加载路径

    单页应用产出的入口chunk大小随着业务的复杂度线性增加,导致后期加载速度越来越慢.后面就需要对不同路径下的模块进行拆分,打包到相应的chunk下,按需加载,找到chunk的大小.个数和页面加载速度的 ...

  9. Vue Router的入门以及简单使用

    Vue Router 是Vue官方的路由管理器,是Vue用来实现SPA的插件.它和 Vue.js 的核心深度集成,让构建单页面应用(SPA)变得易如反掌. 基本概念: 路由:是一种映射关系,是 “pa ...

  10. vue.js利用vue.router创建前端路由

    node.js方式: 利用node.js安装vue-router模块 cnpm install vue-router 安装完成后我们引入这个模板! 下载vue-router利用script引入方式: ...

随机推荐

  1. vs2012 连接oracle11g 及数据的insert及select 的总结

    下载链接Oracle 11g所需的驱动ODTwithODAC1120320_32bit,下载链接为http://www.oracle.com/technetwork/topics/dotnet/uti ...

  2. React-Native 之 常用组件Image使用

    前言 学习本系列内容需要具备一定 HTML 开发基础,没有基础的朋友可以先转至 HTML快速入门(一) 学习 本人接触 React Native 时间并不是特别长,所以对其中的内容和性质了解可能会有所 ...

  3. java基础31 List集合下的Vector集合

    单例集合体系: ---------| collection  单例集合的根接口--------------| List  如果实现了list接口的集合类,具备的特点:有序,可重复       注:集合 ...

  4. tmux 使用

    tmux命令参数 tmux new -s name //创建一个新会话 tmux ls //列出所有会话 tmux a -t name //返回某一个会话 tmux内部命令(ctrl+b之后按) s ...

  5. Python模块Pygame安装

    一.使用pip安装Python包 大多数较新的Python版本都自带pip,因此首先可检查系统是否已经安装了pip.在Python3中,pip有时被称为pip3. 1.在Linux和OS X系统中检查 ...

  6. Effective STL 学习笔记: Item 22 ~ 24

    Effective STL 学习笔记: Item 22 ~ 24 */--> div.org-src-container { font-size: 85%; font-family: monos ...

  7. <编程之美>经典面试题:求二叉树节点的最大距离(我的解法,最容易理解的版本?)

    题目介绍: 如果把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两个节点之间的个数. 写一个程序求一棵二叉树中相距最远的两个节点之间的距离. 如下图所示, ...

  8. Redis(二)CentOS7安装Redis4.0.10与集群搭建

    一 Redis单机安装 1 Redis下载安装 1.1 检查依赖环境(Redis是C语言开发,编译依赖gcc环境) [root@node21 redis-]$ gcc -v -bash: gcc: c ...

  9. bzoj 2819

    2819 思路: 手工栈: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 500005 #define ma ...

  10. docker 删除none镜像

    Windows版本,参考官方地址:https://forums.docker.com/t/how-to-remove-none-images-after-building/7050 docker rm ...