1、路由守卫 是什么

简单来说,导航守卫就是路由跳转前、中、后过程中的一些钩子函数,这个函数能让你操作一些其他的事儿,这就是导航守卫。

官方解释,vue-router提供的导航守卫主要用来通过跳转或取消的方式守卫导航

2、路由守卫分类

导航守卫分为:全局的组件内的单个路由独享三种

2.1、 路由独享的 ------ 1个钩子

指在单个路由配置的时候也可以设置的钩子函数

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

路由独享的钩子函数包括

  • beforeEnter
    与全局的beforeEach完全相同,如果都设置则在beforeEach之后紧随执行,参数to、from、next
2.2 全局的 ------ 2个钩子

路由实例上直接操作的钩子函数,他的特点是所有配置路由的组件都会触发

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

全局路由的钩子函数包括

  • beforeEach
    在路由跳转前触发,参数包括to,from,next(参数会单独介绍)三个,这个钩子作用主要是用于登录验证
  • beforeResolve(2.5+)
    这个钩子和beforeEach类似,也是路由跳转前触发,参数也是to,from,next三个,与beforeEach的区别参考官网。
  • afterEach
  • 是在路由跳转完成后触发,参数包括to,from,它发生在beforeEach和beforeResolve之后,beforeRouteEnter(组件内守卫)之前。
2.3 组件内的------ 3个钩子

指在组件内执行的钩子函数,类似于组件内的生命周期

<template>...
</template>
export default{data(){//...},beforeRouteEnter (to, from, next) {// 在渲染该组件的对应路由被 confirm 前调用// 不!能!获取组件实例 `this`// 因为当守卫执行前,组件实例还没被创建},beforeRouteUpdate (to, from, next) {// 在当前路由改变,但是该组件被复用时调用// 举例来说,对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候,// 由于会渲染同样的 Foo 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用。// 可以访问组件实例 `this`},beforeRouteLeave (to, from, next) {// 导航离开该组件的对应路由时调用// 可以访问组件实例 `this`}
} 

组件内的路由钩子函数包括

  • beforeRouteEnter
    路由进入组件之前调用,参数包括to,from,next。该钩子在全局守卫beforeEach和独享守卫beforeEnter之后,全局beforeResolve和全局afterEach之前调用,要注意的是该守卫内访问不到组件的实例,也就是this为undefined,也就是他在beforeCreate生命周期前触发

  • beforeRouteUpdate
    在当前路由改变时,并且该组件被复用时调用,可以通过this访问实例。参数包括to,from,next。

  • beforeRouteLeave
    导航离开该组件的对应路由时调用,可以访问组件实例this,参数包括to,from,next。

3、路由守卫回调参数

  • to:目标路由对象;

  • from:即将要离开的路由对象;

  • next:他是最重要的一个参数,他相当于佛珠的线,把一个一个珠子逐个串起来。

next()详解:

1.但凡涉及到有next参数的钩子,必须调用next() 才能继续往下执行下一个钩子,否则路由跳转等会停止。

2.当然next可以这样使用,next(’/’) 或者 next({ path: ‘/’ }): 跳转到一个不同的地址。意思是当前的导航被中断,然后进行一个新的导航。可传递的参数与router.push中选项一致。

3.如果要中断当前的导航要调用next(false)。如果浏览器的 URL 改变了 (可能是用户手动或者浏览器后退按钮),那么 URL 地址会重置到from路由对应的地址。(主要用于登录验证不通过的处理)

4.在beforeRouteEnter钩子next((vm)=>{})内接收的回调函数参数为当前组件的实例vm,这个回调函数在生命周期mounted之后调用,也就是,他是所有导航守卫和生命周期函数最后执行的那个钩子。

5、路由之间跳转方式

  • 5.1、直接修改地址栏中的路由地址
  • 5.2、通过router-link实现跳转
   <router-link to="/myRegister">注册</router-link>
  • 5.3、通过js的编程方式

这种方式只能在当前页面打开 ,无法打开一个新页面

   this.$router.push('/myLogin');

如果想打开一个新页面

// 方法一  router-link
<router-link tag="a" target="_blank" :to="{name:'searchGoods',params:{catId:0},query:{keywords:'手机'}}">热门好货</router-link>// 方法二  js
let routeData = this.$router.resolve({path:'/home',query: params,    //根据情况,是否传参params:{catId:params.catId}   //根据情况,是否传参
});
window.open(routeData.href, '_blank');// 方法三  直接使用a标签:
<a href="http://localhost:8088/" target="_blank">{{ msg }}</a>
  • 5.4、通过导航钩子中的next方法修改跳转地址
 beforeRouteEnter (to, from, next) {next('/login')}

6、动态路由配制 以及 动态参数的获取

6.1 动态路由配制

在router目录下的index.js文件中,对path属性中需要动态配制地地方前面加上:
eg :

  routes: [{path: '/foo/:id',component: Foo}]

6.2、 动态参数的获取

this.$route.params   //params对象是所有传递过来的参数

7、router-link 路由传递参数

7.1 query传参

 //query传参<router-link :to="{path:'/test',query: {name: id}}">跳转</router-link>    //获取参数
this.$route.query

7.2 params传参 (也就是动态路由,通过链接传参)

//动态路由 router/index.js
routes: [{path: '/test/:id',component: Foo}]   // id 是路由配制的动态参数
<router-link :to="'/test/'+id">跳转</router-link>//获取方法
this.$route.params

8、简单说明$router和$route的区别

1、$router:是指VueRouter的实例,包含了路由跳转的方法、钩子函数等

$router操控整个路由,用法如下:

  • this.$router.go(-1) // 向前或者向后跳转n个页面,n可为正整数或负整数
  • this.$router.push('/') // 跳转到指定url路径,history栈中会有记录,点击返回会跳转到上个页面
  • this.$router.replace('/') // 跳转到指定url路径,但是history栈中不会有记录,点击返回会跳转到上上个页面
2、$route:是指当前路由信息对象,每一个路由都会有一个route对象,包含path,params,hash,query,fullPath,matched,name等路由信息属性。,

路由实例$router跳转到的当前的路由对象$route
路由实例 可以包含多个 路由对象,它们是父子包含关系,用法如下:

  • this.$route.params // 获取当前路由对象传递过来的参数
  • this.$route.query // 获取当前路由对象传递过来的参数

9、路由组件如何响应路由参数的变化

  1. 方式一: 用watch 检测当前路由对象$route的变化

    // 监听当前路由发生变化的时候执行
    watch: {$route(to, from){console.log(to.path)// 对路由变化做出响应}
    }
    
  2. 方式二: 组件内导航钩子函数

    beforeRouteUpdate(to, from, next){// to do somethings
    }
    

参考链接:https://zhuanlan.zhihu.com/p/54112006

Vue Router 路由(路由守卫)---route相关推荐

  1. Vue Router 实现路由控制实战

    本文是我在学习过程中记录学习的点点滴滴,目的是为了学完之后巩固一下顺便也和大家分享一下,日后忘记了也可以方便快速的复习. Vue Router 实现路由控制实战 前言 一.什么是单页面应用及实现前端路 ...

  2. 面试考问Vue Router 的路由模式,这个回答令我直接出局!

    HR力荐了一个工作 4 年,目前年薪 40W+ 的候选人. 看他简历,从 HTML,CSS,JavaScript ,Vue.js ,再到React 一个都不缺,跨平台PC.移动端.小程序也都接触过,像 ...

  3. 你真的理解 Vue Router 的路由模式吗?

    HR力荐了一个工作 4 年,目前年薪 40W+ 的候选人. 看他简历,从 HTML,CSS,JavaScript ,Vue.js ,再到React 一个都不缺,跨平台PC.移动端.小程序也都接触过,像 ...

  4. 面试考问Vue Router 的路由模式,这个回答令我直接出局~

    HR力荐了一个工作 4 年,目前年薪 40W+ 的候选人. 看他简历,从 HTML,CSS,JavaScript ,Vue.js ,再到React 一个都不缺,跨平台PC.移动端.小程序也都接触过,像 ...

  5. vue router children 路由变了 组件没变_Vue.js从零开始——路由(2)

    因为一些原因,我断更了几天时间,因为要准备面试 + 不在家,抱歉大家! 题图是一个大概的 Vue 模块化项目组成,当然因为我从网上找的,所以可以忽略当中的 Bulma,这其实是一个 CSS 框架,往简 ...

  6. 注意避坑,Vue Router 4: 路由参数在 created/setup 时不可用

    有梦想,有干货,微信搜索 [大迁世界] 关注这个在凌晨还在刷碗的刷碗智. 本文 GitHub https://github.com/qq449245884/xiaozhi 已收录,有一线大厂面试完整考 ...

  7. Vue Router 命名路由、(嵌套)命名视图

    命名路由 在Vue Router中 除了 path 之外,还可以为任何路由提供 name. const routes = [{path: '/user/:username',name: 'user', ...

  8. vue router 的路由传参 params 和 query 的 区别

    1. 不带参数<router-link :to="{name:'home'}"> <router-link :to="{path:'/home'}&qu ...

  9. vue——router更改路由地址,但是页面不能跳转

    在做电商项目时,筛选标签时,需要路由发生变化,但是当前的页面商品列表还需要局部刷新. 如果更改路由后,页面跳转,则是全局刷新,局部刷新才能够满足用户需求. 则此时要做的就是:更改路由地址,但是页面不能 ...

  10. Vue Router 路由管理

    文章目录 Vue Router 路由管理 概述 安装 简单使用 定义2个组件 定义路由信息 支持路由 使用路由 动态路由 配置动态路由 配置404 限制动态参数 嵌套路由 命名路由 编程式导航 简单使 ...

最新文章

  1. 按需生产 ,我们准备好了吗?
  2. Lock与synchronized测试区别
  3. c++学习02——queue
  4. CF Gym 101630 B Box
  5. php生成静态html分页实现方法
  6. 使用C语言----修改密码
  7. char*转为LPCWSTR
  8. [线筛五连]线筛莫比乌斯函数
  9. Java实现十大排序算法
  10. 【黑马程序员数据库】数据库基础大总结
  11. 边缘计算参考架构3.0
  12. uigetfile使用方法
  13. QMT量化交易网格交易 源码
  14. 通过PD4ML把html转pdf(包含显示页眉页脚,插入图片,显示页数)
  15. 重做raid后,重启无法进入系统
  16. 交通期刊JCR(2020)
  17. 学计算机前后对比的图片,大学生“修图前后”对比照,差距一目了然,男生帅气女生惊艳...
  18. 58到家数据库30条军规解读 【转】
  19. VC++流量监控程序源代码
  20. 女王大学 计算机专业,女王大学计算机申请要求是多少?有哪些必修课要求?...

热门文章

  1. 苏州珠宝玉石展览教您鉴别方法
  2. Js根据出生日期计算年龄
  3. 天数怎么换算成月_表格当中把天数换算成月怎么
  4. 【测试】各类视频(MP4、FLV、MKV、3GP)测试地址摘录,目前链接亲测有效!
  5. 一分钟读懂dB、dBm、dBw的区别
  6. 美国佛罗里达州立大学刘毅老师招收机器学习方向全奖博士生
  7. David G. Lowe课题组 Fully Automatic Multi-target Tracking System
  8. 基于Java框架开发OA企业在线办公系统项目教程-附源码-毕业设计
  9. Redis总结笔记(总结自Redis开发与运维)
  10. mysql中dint_MySQL基础篇(1)SQL基础