代码编织梦想

1、路由守卫 是什么

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

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

2、路由守卫分类

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

2.1 全局的

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

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.2 路由独享的

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

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

路由独享的钩子函数包括

  • beforeEnter
    与全局的beforeEach完全相同,如果都设置则在beforeEach之后紧随执行,参数to、from、next
2.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(false)。如果浏览器的 URL 改变了 (可能是用户手动或者浏览器后退按钮),那么 URL 地址会重置到from路由对应的地址。(主要用于登录验证不通过的处理)

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

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

5.next(error): (v2.4.0+) 如果传入 next 的参数是一个 Error 实例,则导航会被终止且该错误会被传递给 router.onError() 注册过的回调。

4、Vue的路由实现

Vue的路由实现,hash模式history模式

4.1 、hash模式

是什么?
在浏览器链接中符号“#”后面的字符称之为hash,用window.location.hash读取;

特点
hash虽然在URL中,但不被包括在HTTP请求中;
仅用来指导浏览器动作,对服务端安全无害,
hash不会重新加载页面。

4.2 、history模式

是什么
history模式是采用HTML5的新特性;且提供了两个新方法:pushState()replaceState() 可以对浏览器历史记录栈进行修改,以及popState事件的监听到状态变更

特点
history 模式下,前端的 URL 被包括在HTTP请求中,如 http://www.xxx.com/items/id。
如果后端有对请求接口的地址进行管理,同时缺少对其相应路由的处理的话,那就将返回 404 错误。(也就是说,后台处理某个接口只能针对某个页面链接请求,其它页面请求该接口将无法请求通)

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/yiyueqinghui/article/details/107291509

Vue项目在ie11浏览器点击跳转时无法跳转,报Loading chunk {n} failed,其他浏览器都没任何错误,解决方法-爱代码爱编程

最近有个Vue项目中会偶尔出现Loading chunk {n} failed的报错,报错来自于webpack进行code spilt之后某些bundle文件lazy loading失败。但是这个问题的根本原因没有被找到,因为这个问题出现的偶然性太高了,而且有的手机上会出现,有的不会,用模拟器不会出现,用真机又会出现,不知道是网络原因还是webpack的b

Vue Route 路由的使用-爱代码爱编程

使用路由的时候有两个必要的知识:   <router-link/>:这个相当于a标签,点击的切换时候的按钮   <router-view/>:这个就是你加载过来的组件放的位置   使用方法:   1、cnpm install vue-router --save 下载路由   2、在main.js 里面引入路由:import

vue router 根据路由区分用户权限并生成动态侧边栏-爱代码爱编程

背景 往往在管理后台系统中,vue-router 要做更多的事情 挂载组件到页面根据不同的用户角色,如:超级管理员,审计用户,普通用户等来做权限管理生成复杂的侧边栏那么,如何使用一套定义好的 router 来做到以上三个需求呢? 分析 首先,我们来细致的分析一下这三个需求有哪些具体需要 挂载组件到页面中 想必不用多说了,vue-router 本

系统学习大前端(10)---vue-router实现、模拟vue、VDOM实现原理-爱代码爱编程

文章内容输出来源:拉勾教育大前端高薪训练营 vue-router实现 基本使用 创建路由组件vue.use()注册vue-router注册router对象设置占位router-view创建链接 router-link动态路由 /detail/:id [获取]$route.params.id[获取]props:true — 推荐()

系统学习大前端(11)---vue-router实现、模拟vue、VDOM实现原理练习-爱代码爱编程

文章内容输出来源:拉勾教育大前端高薪训练营 一、简答题 1、当我们点击按钮的时候动态给 data 增加的成员是否是响应式数据,如果不是的话,如果把新增成员设置成响应式数据,它的内部原理是什么。 let vm = new Vue({ el: '#el' data: { o: 'object', dog: {} }, method: {

Vue-Router核心原理实现-爱代码爱编程

vue-router基本使用 配置路由文件 // 路由配置文件router/index.js // 导入vue和vue-router import Vue from 'vue' import VueRouter from 'vue-router' // 导入首页视图文件 import Index from '../views/Index.vue' /

Vue 单页、路由-爱代码爱编程

目录 单页、路由的基本使用路由模式路由跳转路由传参动态路由路由传参 参数不刷新的问题嵌套路由路由守卫   单页应用:一个页面即一个简单应用,组件化开发 传统的页面调转是浏览器请求新页面,单页是把原本的多个页面以组件的形式集成在一个页面中,页面跳转时由vue路由到目标页面,因为目标页面是当前页面的一部分,切换到指定部分即可,浏览器不用发起新请

angular 路由传参的三种方式-爱代码爱编程

1.问号后面带的参数 url:http://localhost:4200/news?key=japan html调用方法: <a [routerLink]="['/news']" [queryParams]="{key: 'japan'}">跳转</a> ts调用方法: private router: Router th

react路由传参的几种方式-爱代码爱编程

第一种传参方式,动态路由传参 <Link to='/home/dx'>首页</Link> <Route path="/home/:name" component={Home}> 'dx’为被传递的字符串,在home组件中 通过 this.props.match.params 会收到 { name: 'dx

Vue开发技巧总结(四)图片加载失败、组件级路由钩子、递归组件、路由参数解耦、install自定义组件-爱代码爱编程

img图片加载失败 场景:有些时候后台返回的图片不一定能加载成功,加载失败默认显示一张图片 <template> <div> <img :src="imgUrl" @error="handleError" alt=""> </div> </template> <

React路由传参方法汇总记录-爱代码爱编程

React中传参方式有很多,通过路由传参的方式也是必不可少的一种。 本文记录项目中会用到的路由传参方式: 路由跳转传参API + 目标路由获取参数的方式。 一、动态路由 跳转方法 Link <Link to={{ pathname: "/user/add/1" }}>跳转新增页面</Link> history

【vue】路由跳转以及参数获取-爱代码爱编程

【路由跳转 query传参】 this.$router.push({ path: '/home', query: { id: '111' } }) 【query传参 ,获取参数】 const id = this.$route.query.id 【路由跳转 params传参】 this.$router.push({ na