前言

在使用vue开发的过程中,我们经常会接触到生命周期的问题。那么你知道,一个标准的工程项目中,会有多少个生命周期勾子吗?让我们来一起来盘点一下:

  1. 根组件实例:8个 (beforeCreate、created、beforeMount、mounted、beforeUpdate、updated、beforeDestroy、destroyed)

  2. 组件实例:8个 (beforeCreate、created、beforeMount、mounted、beforeUpdate、updated、beforeDestroy、destroyed)

  3. 全局路由钩子:2个 (beforeEach、afterEach)

  4. 组件路由钩子:3个 (beforeRouteEnter、beforeRouteUpdate、beforeRouteLeave)

  5. 指令的周期: 5个 (bind、inserted、update、componentUpdated、unbind)

  6. beforeRouteEnter的next所对应的周期

  7. nextTick所对应的周期

吓到了吗?合计竟然一共有28个周期,是否看得头昏眼花了呢?接下来让我们一起来介绍一下各个周期的通常用途与使用细节吧

组件实例周期

这一块vue2的官方文档有一张图示,我们简要提一下用法和注意

beforeCreate

在实例初始化之后,数据观测(data observer) 和 event/watcher 事件配置之前被调用。

tip:此时组件的选项还未挂载,因此无法访问methods,data,computed上的方法或数据

created

实例已经创建完成之后被调用。在这一步,实例已完成以下的配置:数据观测(data observer),属性和方法的运算, watch/event 事件回调。然而,挂载阶段还没开始,$el 属性目前不可见。

这是一个常用的生命周期,因为你可以调用methods中的方法、改变data中的数据,并且修改可以通过vue的响应式绑定体现在页面上、获取computed中的计算属性等等。

tip:通常我们可以在这里对实例进行预处理。
也有一些童鞋喜欢在这里发ajax请求,值得注意的是,这个周期中是没有什么方法来对实例化过程进行拦截的。
因此假如有某些数据必须获取才允许进入页面的话,并不适合在这个页面发请求。
建议在组件路由勾子beforeRouteEnter中来完成。

beforeMonut

在挂载开始之前被调用:相关的 render 函数首次被调用。

mounted

el 被新创建的 vm.$el 替换,并挂载到实例上去之后调用该钩子。如果 root 实例挂载了一个文档内元素,当 mounted 被调用时 vm.$el 也在文档内。

tip:1.在这个周期内,对data的改变可以生效。但是要进下一轮的dom更新,dom上的数据才会更新。
2.这个周期可以获取 dom。 之前的论断有误,感谢@冯银超 和 @AnHour的提醒
3.beforeRouteEnter的next的勾子比mounted触发还要靠后 4.指令的生效在mounted周期之前 

beforeUpdate

数据更新时调用,发生在虚拟 DOM 重新渲染和打补丁之前。你可以在这个钩子中进一步地更改状态,这不会触发附加的重渲染过程。

updated

由于数据更改导致的虚拟 DOM 重新渲染和打补丁,在这之后会调用该钩子。当这个钩子被调用时,组件 DOM 已经更新,所以你现在可以执行依赖于 DOM 的操作。然而在大多数情况下,你应该避免在此期间更改状态,因为这可能会导致更新无限循环。

beforeDestroy

实例销毁之前调用。在这一步,实例仍然完全可用。

tip:1.这一步还可以用this来获取实例。
2.一般在这一步做一些重置的操作。比如清除掉组件中的 定时器 和 监听的dom事件

destroyed

Vue 实例销毁后调用。调用后,Vue 实例指示的所有东西都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁。

全局路由钩子

作用于所有路由切换,一般在main.js里面定义

router.beforeEach

示例
router.beforeEach((to, from, next) => {console.log('路由全局勾子:beforeEach -- 有next方法') next() })

一般在这个勾子的回调中,对路由进行拦截。
比如,未登录的用户,直接进入了需要登录才可见的页面,那么可以用next(false)来拦截,使其跳回原页面。
值得注意的是,如果没有调用next方法,那么页面将卡在那。

next的四种用法
1.next() 跳入下一个页面
2.next('/path') 改变路由的跳转方向,使其跳到另一个路由 3.next(false) 返回原来的页面 4.next((vm)=>{}) 仅在beforeRouteEnter中可用,vm是组件实例。

router.afterEach

示例
router.afterEach((to, from) => { console.log('路由全局勾子:afterEach --- 没有next方法') })

在所有路由跳转结束的时候调用,和beforeEach是类似的,但是它没有next方法

组件路由勾子

和全局勾子不同的是,它仅仅作用于某个组件,一般在.vue文件中去定义。

beforeRouteEnter

示例beforeRouteEnter (to, from, next) {console.log(this)  //undefined,不能用this来获取vue实例 console.log('组件路由勾子:beforeRouteEnter') next(vm => { console.log(vm) //vm为vue的实例 console.log('组件路由勾子beforeRouteEnter的next') }) }

这个是一个很不同的勾子。因为beforeRouterEnter在组件创建之前调用,所以它无法直接用this来访问组件实例。
为了弥补这一点,vue-router开发人员,给他的next方法加了特技,可以传一个回调,回调的第一个参数即是组件实例。
一般我们可以利用这点,对实例上的数据进行修改,调用实例上的方法。

我们可以在这个方法去请求数据,在数据获取到之后,再调用next就能保证你进页面的时候,数据已经获取到了。没错,这里next有阻塞的效果。你没调用的话,就会一直卡在那

tip:next(vm=>{console.log('next')  })
这个里面的代码是很晚执行的,在组件mounted周期之后。没错,这是一个坑。你要注意。
beforeRouteEnter的代码时很早执行的,在组件beforeCreate之前;
但是next里面回调的执行,很晚,在mounted之后,可以说是目前我找到的,离dom渲染最近的一个周期。

beforeRouteLeave

  beforeRouteLeave (to, from, next) {console.log(this)    //可以访问vue实例console.log('组件路由勾子:beforeRouteLeave') next() },

在离开路由时调用。可以用this来访问组件实例。但是next中不能传回调。

beforeRouteUpdate

这个方法是vue-router2.2版本加上的。因为原来的版本中,如果一个在两个子路由之间跳转,是不触发beforeRouteLeave的。这会导致某些重置操作,没地方触发。在之前,我们都是用watch $route来hack的。但是通过这个勾子,我们有了更好的方式。

老实讲,我没用过这个勾子,所以各位可以查看一下文章之前的文档,去尝试一下,再和我交流交流。

指令周期

绑定自定义指令的时候也会有对应的周期。
这几个周期,我比较常用的,一般是只有bind。

bind

只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。

inserted

被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
实际上是插入vnode的时候调用。

update

被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新。
慎用,如果在指令里绑定事件,并且用这个周期的,记得把事件注销

componentUpdated

被绑定元素所在模板完成一次更新周期时调用。

unbind

只调用一次, 指令与元素解绑时调用。

Vue.nextTick、vm.$nextTick

示例:created () {this.$nextTick(() => {console.log('nextTick') //回调里的函数一直到真实的dom渲染结束后,才执行 }) console.log('组件:created') },

nextTick方法的回调会在dom更新后再执行,因此可以和一些dom操作搭配一起用,如 ref。
非常好用,可以解决很多疑难杂症。

场景:
你用ref获得一个输入框,用v-model绑定。
在某个方法里改变绑定的值,在这个方法里用ref去获取dom并取值,你会发现dom的值并没有改变。
因为此时vue的方法,还没去触发dom的改变。
因此你可以把获取dom值的操作放在vm.$nextTick的回调里,就可以了。

转载于:https://www.cnblogs.com/chris-oil/p/9241478.html

vue生命周期探究(一)相关推荐

  1. 初探 Vue 生命周期和钩子函数

    生命周期 生命周期函数就是 Vue 实例在某一个时间点会自动执行的函数. 简单来说就是好像把人的出生到死亡分成一个个阶段,你取名字肯定是在你出生阶段,而不是在成年阶段:你结婚肯定是在成年阶段,而不是在 ...

  2. Vue生命周期和钩子函数的一些理解

    vue生命周期简介 咱们从上图可以很明显的看出现在vue2.0都包括了哪些生命周期的函数了. 生命周期探究 对于执行顺序和什么时候执行,看上面两个图基本有个了解了.下面我们将结合代码去看看钩子函数的执 ...

  3. Vue 生命周期记录_学习笔记

    官方给出的设计图入戏 为了能更好的理解这个图呢,写了下面的demo <!DOCTYPE html> <html><head><meta charset=&qu ...

  4. 标注图+部分举例聊聊Vue生命周期

    "你不需要立马弄明白所有的东西,不过随着你的不断学习和使用,它的参考价值会越来越高." 现在项目中遇到了,好好回头总结一波Vue生命周期,以后用到的时候再来翻翻. 啥叫Vue生命周 ...

  5. vue hot true 不起作用_从源码解读 Vuex 注入 Vue 生命周期的过程

    第一篇文章我会结合 Vue 和 Vuex 的部分源码,来说明 Vuex 注入 Vue 生命周期的过程. 说到源码,其实没有想象的那么难.也和我们平时写业务代码差不多,都是方法的调用.但是源码的调用树会 ...

  6. 少侠请重新来过 - Vue学习笔记(二) - Vue生命周期

    Vue 生命周期和钩子 每一个vue实例创建时,会经历一段初始化的过程,同时会调用其生命周期钩子,实例的钩子this指向它的Vue实例,不需要在钩子用箭头函数. <template>< ...

  7. vue生命周期图示中英文版Vue实例生命周期钩子

    vue生命周期图示中英文版Vue实例生命周期钩子 知乎上近日有人发起了一个 "react 是不是比 vue 牛皮,为什么?" 的问题,Vue.js 作者尤雨溪12月4日正面回应了该 ...

  8. 异步加载在Vue生命周期哪个阶段更合理

    react高阶面试题中有这么一道:为什么异步请求数据在didMount阶段更合适?同为MVVM中的翘楚,Vue是否也有类似问题呢?另外,我在平时也无开发过程中也会发现,每个人选择的那个生命周期阶段去异 ...

  9. 一文带你吃透Vue生命周期(结合案例通俗易懂)

    文章目录 本篇学习目标 1. vue生命周期 1.0_人的-生命周期 1.1_钩子函数 1.2_初始化阶段 1.3_挂载阶段 1.4_更新阶段 1.5_销毁阶段 2. axios 2.0_axios基 ...

最新文章

  1. 无人车版「驾校」在长沙开业,7天24小时营业,无人值守的那种
  2. 谈谈document.ready和window.onload的区别
  3. wkWebView 的一些问题
  4. C#设计模式学习资料--原型模式
  5. jzoj5698-[gdoi2018day1]密码锁【贪心,差分】
  6. 最常问的Java面试题,有Get吗?
  7. Spark 中 File,Block,Split,Task,Partition,RDD概念的理解
  8. 字符大小端aix linux,Go交叉编译的那些事
  9. mysql 怎么修改成新字段_Mysql入门第一课《建表、改表、删表》
  10. Golang channel 快速入门
  11. scapy python_Scapy在Python脚本中
  12. 在eclipse-oxygen-sts中,关于快捷键[CTRL + SHIFT + O]失效的问题
  13. Dijkstra算法python可视化实现
  14. IOS Core ML如何把输入从MLMultiArray转换为image
  15. imdisk虚拟光驱安装linux,u深度ImDisk虚拟光驱加载iso镜像文件图文详细教程
  16. 数值分析思考题 (钟尔杰版) 参考解答——第三章
  17. 无线专题 路由器和交换机、光猫的区别
  18. 2022人工智能学习--完整入门攻略
  19. 图像文件的读写和转换——BMP转YUV
  20. 软件测试理论与经验--阅读笔记

热门文章

  1. iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 规范与部署
  2. 设计模式之外观模式(Fasade Pattern)
  3. jenkins无法安装插件问题
  4. RxJava+Retrofit+MVP+Dagger2
  5. 信息时代把数据当成了信息,互联网让数据真正发挥出价值,让人们相信人眼看不见的数据世界。...
  6. SpingMVC ModelAndView, Model,Control以及参数传递
  7. Salt Master外部Job Cache配置
  8. 分区表理论解析(上):SQL Server 2k52k8系列(一)
  9. 用java做出两行三列的表格_Java中,使用HSSFSheet创建excel模板如何创建一列两行的数据?...
  10. 虚拟机上装的centos7使用xshell连接不上_使用Xshell连接虚拟机Ubuntu