详解Vue2.X的路由管理记录之 钩子函数(切割流水线)


Posted in Javascript onMay 02, 2017

$route可以在子组件任何地方调用,代表当前路由对象,这个属性是只读的,里面的属性是 immutable(不可变) 的,不过你可以 watch(监测变化) 它。

导航和钩子函数:

导航:路由正在发生改变   关键字:路由  变

钩子函数:在路由切换的不同阶段调用不同的节点函数(钩子函数在我看来也就是:某个节点和时机触发的函数)

 两者关系:

钩子函数 ---> 导航 :钩子函数   主要用来拦截导航,让它完成跳转或取消,在导航的不同阶段来执行不同的函数 ,最后钩子函数的执行结果会告诉导航怎么做。。

导航 ---> 钩子函数 :导航在所有钩子 resolve 完之前一直处于 等待中,等待钩子函数告诉它下一步该怎么做。用next()来指定。

全局钩子函数之   全局的beforeEach钩子:

详解Vue2.X的路由管理记录之 钩子函数(切割流水线)

 例子: 在每次发生路由导航是最开始先检测用户是否登录

router.beforeEach(({meta, path}, from, next) => {


const {auth = true} = meta   // meta代表的是to中的meta对象,path代表的是to中的path对象


var isLogin = Boolean(store.state.user.id)  // true用户已登录, false用户未登录 



if (auth && !isLogin && path !== '/login') {  // auth 代表需要通过用户身份验证,默认为true,代表需要被验证, false为不用检验


return next({ path: '/login' })  // 跳转到login页面

}



next()  // 进行下一个钩子函数
})

先说这个beforeEach的钩子函数,它是一个全局的before 钩子函数, (before each)意思是在 每次每一个路由改变的时候都得执行一遍。

它的三个参数:

  1. to: (Route路由对象)  即将要进入的目标 路由对象    to对象下面的属性: path   params  query   hash   fullPath    matched   name    meta(在matched下,但是本例可以直接用)
  2. from: (Route路由对象)  当前导航正要离开的路由
  3. next: (Function函数)   一定要调用该方法来 resolve 这个钩子。  调用方法:next(参数或者空)   ***必须调用

next(无参数的时候):  进行管道中的下一个钩子,如果走到最后一个钩子函数,那么  导航的状态就是 confirmed (确认的)

next('/') 或者 next({ path: '/' }): 跳转到一个不同的地址。当前的导航被中断,然后进行一个新的导航。

 全局钩子函数之   全局的afterEach钩子:

after 钩子没有 next 方法,不能改变导航,代表已经确定好了导航怎么去执行后,附带的一个执行钩子函数

组件内的钩子函数:( beforeRouteEnter 和 beforeRouteLeave 再加一个 watch函数 )

vue2.X的组件内钩子函数比vue1.X减少了许多。。

https://github.com/vuejs/vue-router/blob/43183911dedfbb30ebacccf2d76ced74d998448a/examples/navigation-guards/app.js#L49 

  1. 使用组件自身的生命周期钩子函数来替代 activate 和 deactivate
  2. 在 $router 上使用 watcher 来响应路由改变
  3. canActivate 可以被 router 的配置中的 beforeEnter 中实现
  4. canDeactivate 已经被 beforeRouteLeave 取代, 后者在一个组件的根级定义中指定。这个钩子函数在调用时是将组件的实例作为其上下文的。
  5. canReuse 已经被移除,因其容易混淆且很少被用到。
  6. 用ajax获取数据的data(to, from, next) 钩子用组件内 beforeRouteEnter (to, from, next)来替代 

先来解释下vue1.X中的组件内钩子函数:

组件的钩子函数一共6个:

  1. data:可以设置组件的data
  2. activate:激活组件
  3. deactivate:禁用组件
  4. canActivate:组件是否可以被激活
  5. canDeactivate:组件是否可以被禁用
  6. canReuse:组件是否可以被重用

 vue-router1.X中   每个切换钩子函数都会接受一个 transition 对象作为参数,参数下有5个属性/方法  to from next()  abort([reason]) redirect(path) 

 vue-router2.X中   其中后三个都归到next()函数里了  ,  所以next()函数改为3个直接的参数  ( to from next() )

例子:

详解Vue2.X的路由管理记录之 钩子函数(切割流水线)

详解Vue2.X的路由管理记录之 钩子函数(切割流水线)

详解Vue2.X的路由管理记录之 钩子函数(切割流水线) 

详解Vue2.X的路由管理记录之 钩子函数(切割流水线)

详解Vue2.X的路由管理记录之 钩子函数(切割流水线) 

详解Vue2.X的路由管理记录之 钩子函数(切割流水线)

路由的切换分为三个阶段:可重用阶段,验证阶段和激活阶段

以   home/news  切换到   home/message  为例来描述各个阶段

 可以重用组件Home,因为重新渲染后,组件Home依然保持不变。

详解Vue2.X的路由管理记录之 钩子函数(切割流水线)

确保切换效果有效——也就是说,为保证切换中涉及的所有组件都能按照期望的那样被停用/激活

详解Vue2.X的路由管理记录之 钩子函数(切割流水线)

需要停用并移除组件News,启用并激活组件Message。

详解Vue2.X的路由管理记录之 钩子函数(切割流水线)

此阶段对应钩子函数的调用顺序和验证阶段相同,其目的是在组件切换真正执行之前提供一个进行清理和准备的机会

界面的更新会等到所有受影响组件的 deactivate 和 activate 钩子函数执行之后才进行。

data 这个钩子函数会在 activate 之后被调用,或者当前组件组件可以重用时也会被调用。

通过上述vue-router1.x,那么2.x的执行顺序可以如以下方式理解:

钩子的执行顺序就是:1、最开始beforeEach钩子,

2、然后旧的组件是否能重用canReuse,不重用的是否能canDeactivate,再看新的组件是否canActivate,再后把不能重用的能销毁的给deactivate

3、这样旧的不重用的组件就结束了它的生命周期了,所以这时候在结束生命周期之前执行调用afterEach函数

4、新组建开始的话先是activate,然后再是data,如果重用的话就没有销毁,所以一直在activate中,只是执行data钩子。

那么这样的钩子函数对应给vue2.x会是怎样的呢???(--------待验证-------)

1、最先执行的是 beforeEach钩子,所有路由开始的时候最先执行。

2、然后就是 router 的配置中的beforeEnter。

3、接下来是    路由的  beforeRouteEnter  -----    然后是组件自身的生命周期   ------  路由 beforeRouteLeave

beforeRouteEnter (to, from, next) {}  与  beforeRouteLeave不再是组件中route配置下的对象了,他们和data处于同级别的地位。

可以看出:  新设计的路由     淡化了组件自身跟着路由生命周期变化而变化,而是依赖组件自身的生命周期,只有两个简单的   路由级别的钩子 beforeRouteEnter beforeRouteLeave

那么接下来:

ajax调用时机:相对于组件来说的,而且应该是在路由进入之前开始准备的 所以beforeRouteEnter是调用ajax的时机。

watch这一函数可以监听路由$route变化。

beforeRouteLeave在组件的生命周期完成后,且旧路由即将切换走,新路由beforeEach的时机执行。

watch的使用时机:

当使用路由参数时,例如从 /user/foo 导航到 user/bar,原来的组件实例会被复用。因为两个路由都渲染同个组件,比起销毁再创建,复用则显得更加高效。

不过,这也意味着   组件的生命周期钩子不会再被调用。

复用组件时,想对路由参数的变化作出响应的话,你可以简单地 watch(监测变化) $route 对象:

const User = {
 template: '...',
 1、watch: {
  '$route' (to, from) {
   // 对路由变化作出响应...
  }
 }
 2、watch: { 
 '$route': 'fetchData'

// 如果路由有变化,会再次执行fetchData方法
 },

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
实现局部遮罩与关闭原理及代码
Feb 04 Javascript
20行代码实现的一个CSS覆盖率测试脚本
Jul 07 Javascript
简单实现兼容各大浏览器的js复制内容到剪切板
Sep 09 Javascript
基于jQuery实现美观且实用的倒计时实例代码
Dec 30 Javascript
微信小程序 框架详解及实例应用
Sep 26 Javascript
通过jsonp获取json数据实现AJAX跨域请求
Jan 22 Javascript
vue增删改查的简单操作
Jul 15 Javascript
webpack构建vue项目的详细教程(配置篇)
Jul 17 Javascript
vue mixins组件复用的几种方式(小结)
Sep 06 Javascript
vue的列表交错过渡实现代码示例
May 05 Javascript
微信小程序跨页面传递data数据方法解析
Dec 13 Javascript
原生JS实现飞机大战小游戏
Jun 09 Javascript
令按钮悬浮在(手机)页面底部的实现方法
May 02 #Javascript
Vue2.0表单校验组件vee-validate的使用详解
May 02 #Javascript
ES6学习教程之对象的扩展详解
May 02 #Javascript
Javascript ES6中数据类型Symbol的使用详解
May 02 #Javascript
Bootstrap实现基于carousel.js框架的轮播图效果
May 02 #Javascript
Vue2.x中的父子组件相互通信的实现方法
May 02 #Javascript
详解webpack 配合babel 将es6转成es5 超简单实例
May 02 #Javascript
You might like
PHP实现冒泡排序的简单实例
2016/05/26 PHP
php中mkdir()函数的权限问题分析
2016/09/24 PHP
PHP+jQuery实现双击修改table表格功能示例
2019/02/21 PHP
Google Map V3 绑定气泡窗口(infowindow)Dom事件实现代码
2013/04/26 Javascript
jQuery实现带有动画效果的回到顶部和底部代码
2015/11/04 Javascript
分析js闭包引起的事件注册问题
2016/03/29 Javascript
jQuery的promise与deferred对象在异步回调中的作用
2016/05/03 Javascript
浅析Javascript中bind()方法的使用与实现
2016/05/30 Javascript
新入门node.js必须要知道的概念(必看篇)
2016/08/10 Javascript
什么是JavaScript中的结果值?
2016/10/08 Javascript
ES6中module模块化开发实例浅析
2017/04/06 Javascript
微信小程序自定义模态对话框实例详解
2017/08/16 Javascript
JavaScript模块模式实例详解
2017/10/25 Javascript
vue的style绑定background-image的方式和其他变量数据的区别详解
2018/09/03 Javascript
Three.js实现3D机房效果
2018/12/30 Javascript
nodejs使用node-xlsx生成excel的方法示例
2019/08/22 NodeJs
实例分析JS中的相等性判断===、 ==和Object.is()
2019/11/17 Javascript
谈谈JavaScript令人迷惑的==与+
2020/08/31 Javascript
Python模拟登陆淘宝并统计淘宝消费情况的代码实例分享
2016/07/04 Python
python numpy格式化打印的实例
2018/05/14 Python
基于Python pip用国内镜像下载的方法
2018/06/12 Python
python生成多个只含0,1元素的随机数组或列表的实例
2018/11/12 Python
python assert的用处示例详解
2019/04/01 Python
Python对接 xray 和微信实现自动告警
2019/09/17 Python
详解Python3 中的字符串格式化语法
2020/01/15 Python
Python标准库shutil模块使用方法解析
2020/03/10 Python
CSS3 实现飘动的云朵动画
2020/12/01 HTML / CSS
英国运动服、设备及配件网站:DW Sports
2019/12/04 全球购物
劳动工资科岗位职责范本
2014/03/02 职场文书
药品销售内勤岗位职责
2015/04/13 职场文书
军事博物馆观后感
2015/06/05 职场文书
运动会新闻稿
2015/07/17 职场文书
2015初中政教处工作总结
2015/07/21 职场文书
HTML基础-标签分类(闭合标签,空标签,块级元素,行内元素,行级块元素,可替换元素)
2021/03/31 HTML / CSS
HTML5之高度塌陷问题的解决
2022/06/01 HTML / CSS
MySQL 原理与优化之Limit 查询优化
2022/08/14 MySQL