因为我是初学者,所以本文主要是对vue-router导航钩子官方文档 进行了稍微的解释,以及加了些栗子方便理解。

什么是导航钩子?官方解释:

正如其名,vue-router 提供的导航钩子主要用来拦截导航,让它完成跳转或取消。有多种方式可以在路由导航发生时执行钩子:全局的,单个路由独享的,或者组件级的。

简言之就是用来监听URL改变事件的,当URL发生改变的时候就触发 vue-router 的导航钩子。

全局钩子

你可以使用 beforeEach 注册一个全局的 before 钩子:

const router = new VueRouter({ ... });router.beforeEach((to, from, next) => {// ...next();  // 不写这个那就是说这个导航钩子一直都不会 resolve 完,导航就一直处于 等待中
});

当一个导航触发时,全局的 before 钩子按照创建顺序调用。钩子是异步解析执行,此时导航在所有钩子 resolve 完之前一直处于 等待中

每个钩子方法接收三个参数:

  • to: Route: 即将要进入的目标 路由对象

  • from: Route: 当前导航正要离开的 路由对象,to 和 from 都是一个路由对象,所以你完全可以使用它们来做一些操作。

  • next: Function: 一定要调用该方法来 resolve 这个钩子。这个方法是给你的,直接用就行了。执行效果依赖 next 方法的调用参数。

    • next():  进行管道中的下一个钩子。如果全部钩子执行完了,则导航的状态就是 confirmed (确认的)。

    • next(false): 中断当前的导航。如果浏览器的 URL 改变了(可能是用户手动或者浏览器后退按钮),那么 URL 地址会重置到 from 路由对应的地址。就是说给 next 方法一个 false 参数的话,vue-router 会中断当前的导航强制回到 from 的地址,无论你怎么手动修改地址都没用,就是不让你跳转。

    • next( '/' ) 或者 next({ path: '/' }) : 跳转到一个不同的地址。当前的导航被中断,然后进行一个新的导航。不过这个东西要小心用,因为它也会触发钩子的因为它也会触发钩子的因为它也会触发钩子的

确保要调用 next 方法,否则钩子就不会被 resolved。

一个简单的栗子,废话不多少下面看:

router1.vue

<template><h3>Here is router-1</h3>
</template>

router2.vue

<template><h3>Welcome to router-2</h3>
</template>

router3.vue

<template><h3>Get out here</h3>
</template>

app.vue

<template><div><router-link to="/r1">Go to router-1</router-link><router-link to="/r2">Go to router-2</router-link><router-link to="/r3">Go to router-3</router-link><router-view></router-view></div>
</template>

index.html

<!DOCTYPE html>
<html lang="zh-CN"><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1"><title>myVue</title>
</head><body><div id="app"><app /></div>
</body></html>

index.js

// 引入 vue 和 vue-router
import Vue from 'vue'
import VueRouter from 'vue-router'import app from './components/app.vue'
import router1 from './components/router1.vue'
import router2 from './components/router2.vue'
import router3 from './components/router3.vue'// vue-router光是引进来是没用的,还需要使用
Vue.use(VueRouter);const routes = [{path: '/r1',component: router1
}, {path: '/r2',component: router2
}, {path: '/r3',component: router3
}];const router = new VueRouter({routes
});// 全局钩子
router.beforeEach((to, from, next) => {if (to.path == '/r2' || from.path == '/r2') {alert('Go to ' + to.path);next();} else {// next({path: 'url'}) 因为这个也会触发钩子,所以要小心用喔.// 如果这里写的不是 '/r2' 而是 '/' 或者其他,那么可能会导致死循环或者报错,可以自己试试next({path: '/r2'});}
});new Vue({el: '#app',router,components: {app}
});

这个栗子中,全局钩子说明了如果不是跳转到 '/r2' 路径或者不是从 '/r2' 路径路由到其他路径的话,vue-router 就会自动地路由到 '/r2'。

效果:

同样可以注册一个全局的 after 钩子,不过它不像 before 钩子那样,after 钩子没有 next 方法,不能改变导航:

router.afterEach(route => {// do something
})

afterEach 的 route 路由对象对应 beforeEach 的 to 路由对象,这里没有栗子,它表示导航已经确定了,看看你还有什么想要做的。

某个路由独享的钩子

你可以在路由配置上直接定义 beforeEnter 钩子:

const router = new VueRouter({routes: [{path: '/foo',component: Foo,beforeEnter: (to, from, next) => {// ...next();  // 同样的不加的话导航就一直是等待中哦}}]
})

参数一样,用法也是一样的,两个路由对象和一个 next() 方法,这里没有栗子,可以自己玩玩。

组件内的钩子

最后,你可以在路由组件内直接定义以下路由导航钩子:

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

beforeRouteEnter 钩子不能访问 this,因为钩子在导航确认前被调用,因此即将登场的新组件还没被创建。

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

beforeRouteEnter (to, from, next) {next(vm => {// 通过 `vm` 访问组件实例console.log(vm)  // 感兴趣的不妨将它"解剖"研究看看})
}

你可以 在 beforeRouteLeave 中直接访问 this 。这个 leave 钩子通常用来禁止用户在还未保存修改前突然离开。可以通过 next(false) 来取消导航。

其实官方文档已经写得很好了(毕竟vuejs的作者可是国人呐!),只需要稍微实践一下基本都可以理解了~

vue-router 导航钩子相关推荐

  1. VUE router 导航重复点击报错的问题解决两种方案

    VUE router 导航重复点击报错的问题解决两种方案 前几天一个月薪35k的兄弟,给我推了一个人工智能学习网站,看了一段时间挺有意思的.包括语音识别.机器翻译等从基础到实战都有,很详细,分享给大家 ...

  2. vue进入页面执行的钩子函数_vue router的钩子函数总结

    模块一:全局导航钩子函数 1.vue router.beforeEach(全局前置守卫) beforeEach的钩子函数,它是一个全局的before 钩子函数, (before each)意思是在 每 ...

  3. Vue Router 路由导航

    Vue Router 通过 Vue.js,我们已经用组件组成了我们的应用.当加入 Vue Router 时,我们需要做的就是将我们的组件映射到路由上,让 Vue Router 知道在哪里渲染它们. V ...

  4. vue学习之,导航钩子

    vue-router 的导航钩子,主要用来作用是拦截导航,让他完成跳转或取消. 有三种方式可以植入路由导航过程中: 全局的 单个路由独享的 组件级的 全局导航钩子: 全局导航钩子主要有两种钩子:前置守 ...

  5. 你可能不清楚的 Vue Router 深度用法(一)

    Vue Router 简单易上手,能实现大部分的需求.但是,如果在项目里需要更细致的控制路由,以实现与其同步的效果,就需要挖掘其文档里没详细提及的内容.第一章为路由元信息用途挖掘. 路由元信息用途 ( ...

  6. Vue.js 从 Vue Router 0.7.x 迁移

    从 Vue Router 0.7.x 迁移 只有 Vue Router 2 是与 Vue 2 相互兼容的,所以如果你更新了 Vue ,你也需要更新 Vue Router .这也是我们在主文档中将迁移路 ...

  7. vue router 参数_Vue.js项目开发技术解析

    Vue.js项目开发技术解析 一.Vue.js实例 在一个Vue.js工程中,用于显示内容最基层的实例称之为根实例.通过该实例可以进行页面或组件的更新和显示.对于项目本身而言,无论是什么样的页面,都要 ...

  8. vue路由的钩子函数有哪些?都做了哪些事情?

    Vue Router 是 Vue.js 官方的路由管理器.它和 Vue.js 的核心深度集成,让构建单页面应用变得易如反掌.包含的功能有: 嵌套的路由/视图表 模块化的.基于组件的路由配置 路由参数. ...

  9. Vue Router的详细教程

    Vue Router的详细教程 安装 #直接下载 / CDN https://unpkg.com/vue-router/dist/vue-router.js Unpkg.com 提供了基于 NPM 的 ...

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

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

最新文章

  1. 给UIScrollView添加category实现UIScrollView的轮播效果
  2. LeetCode139:Word Break
  3. vue.jsr入门_JSR-308和Checker框架为jOOQ 3.9添加了更多类型安全性
  4. 使用函数统计指定c语言,浙大版《C语言程序设计(第3版)》题目集 习题5-5 使用函数统计指定数字的个数...
  5. python copy()和deepcopy()解释(import copy)
  6. 函数hook注意事项
  7. HTTP协议的请求与响应和CSS属性和定位
  8. [码海拾贝 之JS] JS 之删除数组中的元素
  9. RNN 循环神经网络系列 5: 自定义单元
  10. linux可视化界面改ip,Linux图形界面模式更改ip地址
  11. ElasticSearch测试数据集
  12. 中国股市十大风云人物
  13. 删库跑路?我劝你不要这样。
  14. Java 进阶 hello world! - 中级程序员之路
  15. 一个简单的集合并级取反问题 !A or !B == !(A and B)
  16. 一分钟教会你黑白图片如何上色
  17. PHP导出word【 直接生成word文件 】
  18. [自动驾驶]高德的高精度地图
  19. Apache httpd服务器下载及安装
  20. 发烧怎么办?按这5个穴位

热门文章

  1. 性能优化(应用程序、cpu)
  2. python服务端编程_Python WebSocket服务端编程代码完成gtalk机器人
  3. 盛世昊通与中国品牌CaldiceKris达成战略合作
  4. 计算机运行游戏时卡死,笔记本电脑一玩游戏就卡死机怎么办
  5. lazyload ajax同步,jQuery lazyload 的重复加载错误以及修复方法
  6. CTF工具分享(下)
  7. Shiro与SpringBoot整合,实现登录拦截、用户认证、用户授权等。实战demo
  8. websocket autobahn jar包的用法
  9. 将安卓手机投影到电脑上(linux系统)
  10. windows电脑共享视频给手机