当前位置: 首页 > news >正文

vue-router路由导航钩子

导航钩子

vue-router提供的导航钩子主要用来拦截导航,让它完成跳转或者取消。有多种方式:全局的守卫,路由独享的守卫,或者组件级的守卫。
全局的钩子

const router = new VueRouter({ ... })
router.beforeEach((to, from, next) => {
    // do something 
    next();
});  //全局前置守卫

router.afterEach((to, from) => {
    console.log(to.path);
});  //全局后置守卫,不会接受next函数也不会改变导航本身

每个钩子接收三个参数:

  • to:Route :即将要进入的目标[路由对象]
  • from:Route:当前导航即将离开的路由
  • next:Function:一定要调用该方法来resolve这个钩子。执行效果依赖next方法的调用参数。

    • next(): 进行管道中的下一个钩子。如果全部钩子执行完了,则导航的状态就是 confirmed (确认的)。
    • next(false):中断当前的导航。如果浏览器的URL改变了(可能使用户手动或者浏览器后退按钮),那么URL地址会重置到from路由对应的地址
    • next(‘/’)或者next({path:’/’}):跳转到一个不同的地址。当前的导航被中断,然后进行一个新的导航
    • next(error):如果传入next的参数是一个Error实例,则导航会被终止且该错误会被传递给router.onError()注册过的回调
      确保调用next方法,否则钩子就不会被resolved。

路由独享的守卫

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

这些守卫与全局前置守卫的方法参数是一样的。

组件内的守卫

  • beforeRouteEnter
  • beforeRouteUpdate (2.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,因为守卫在导航确认前被调用,因此即将登场的新组件还没被创建。

不过,你可以通过传一个回调给 next来访问组件实例。在导航被确认的时候执行回调,并且把组件实例作为回调方法的参数。

beforeRouteEnter (to, from, next) {
  next(vm => {
    // 通过 `vm` 访问组件实例
  })
}

注意: beforeRouteEnter 是支持给 next 传递回调的唯一守卫。对于 beforeRouteUpdate 和 beforeRouteLeave 来说,this 已经可用了,所以不支持传递回调,因为没有必要了。

beforeRouteUpdate (to, from, next) {
  // just use `this`
  this.name = to.params.name
  next()
}

这个离开守卫通常用来禁止用户在还未保存修改前突然离开。该导航可以通过 next(false) 来取消。

beforeRouteLeave (to, from , next) {
  const answer = window.confirm('Do you really want to leave? you have unsaved changes!')
  if (answer) {
    next()
  } else {
    next(false)
  }
}

相关文章:

  • javascript本地上传并解析excel文件
  • echarts柱状图的x轴文字纵向显示
  • ajax实现跨域请求的几种方式--前端
  • css3-单位px与vw,rem的区别
  • openlayers4通过拖动滑动条设置图层颜色透明度
  • openlayers4判断一个点是否在闭合图形的内部
  • 常见电脑屏幕分辨率
  • css3更改默认滚动条样式-webkit-scrollbar
  • GIS开发-天地图按照地名搜索定位
  • css3中的伪类before和after常见用法
  • openlayers4获取一个图形的边界
  • Vue.js小例子--tab选项卡切换
  • 使用openlayers3加载png格式图片
  • openalyers为自定义覆盖物overlay添加点击事件
  • absolute和float的区别
  • 0x05 Python数据分析,Anaconda八斩刀
  • Android 控件背景颜色处理
  • bearychat的java client
  • codis proxy处理流程
  • Flannel解读
  • React-生命周期杂记
  • Spring声明式事务管理之一:五大属性分析
  • ucore操作系统实验笔记 - 重新理解中断
  • vue学习系列(二)vue-cli
  • WePY 在小程序性能调优上做出的探究
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 今年的LC3大会没了?
  • 前端学习笔记之观察者模式
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 新书推荐|Windows黑客编程技术详解
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • $$$$GB2312-80区位编码表$$$$
  • $.ajax中的eval及dataType
  • (4)STL算法之比较
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (ros//EnvironmentVariables)ros环境变量
  • (ZT)一个美国文科博士的YardLife
  • (多级缓存)缓存同步
  • (附源码)php投票系统 毕业设计 121500
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (十六)串口UART
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (转载)hibernate缓存
  • ... 是什么 ?... 有什么用处?
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .NET简谈设计模式之(单件模式)
  • .NET中的Event与Delegates,从Publisher到Subscriber的衔接!
  • /etc/fstab 只读无法修改的解决办法
  • ??myeclipse+tomcat
  • @RunWith注解作用
  • [2016.7.Test1] T1 三进制异或
  • [2023-年度总结]凡是过往,皆为序章
  • [ai笔记4] 将AI工具场景化,应用于生活和工作