Vue 生命周期
1.定义
vue 的生命周期是指 vue 实例从初始化创建到实例销毁的过程。期间会有8个钩子函数的调用。
2.图解
3.钩子函数使用总结
3.1 beforeCreate
beforeCreate
钩子函数,这个时候,Vue
实例的挂载元素 $el
和数据对象 data
都为 undefined
,还未初始化。无法访问真实的 dom
和 data
中的数据,可以在这里面使用 loading
。
3.2 created
created
函数中可以对 data
对象里面的数据进行使用和更改,不会触发其他的钩子函数,一般可以在这里做初始数据的获取,也可以结束 loading
。 这里进行 dom
操作需要使用 vue.nextTick()
方法。
3.3 beforeMount
beforeMount
钩子函数,vue
实例的 $el
和 data
都初始化了,但还是虚拟的 dom
节点,具体的 data.filter
还未替换。在这里也可以更改数据,不会触发其他的钩子函数。
3.4 mounted
mounted
钩子函数,此时,组件已经出现在页面中,数据、真实 dom
都已经处理好了。事件都已经挂载好了,data.filter
成功渲染,可以在这里操作真实 dom
等事情。
3.5 beforeUpdate
当组件或实例的数据更改之后,会立即执行 beforeUpdate
,然后 vue
的虚拟 dom
机制会重新构建虚拟dom
与上一次的虚拟dom
树利用diff
算法进行对比之后重新渲染,一般不做什么事。
3.6 updated
当更新完成后,执行updated
,数据已经更改完成,dom
也重新render
完成,可以操作更新后的虚拟dom
。
3.7 beforeDestroy
当经过某种途径调用 $destroy
方法后,立即执行 beforeDestroy
,一般在这里做一些善后工作,例如清除计时器、清除非指令绑定的事件等等。
3.8 destroyed
vue
实例解除了事件监听以及和 dom
的绑定(无响应了),但 DOM
节点依旧存在。这个时候,执行destroyed
,在这里做善后工作也可以。
4. 示例
<template> <div id="app"> <input type="button" value="修改msg" @click="msg='No'"> <h3 id="h3"> {{msg}} </h3> </div> </template> <script> // 创建 Vue 实例,得到 ViewModel var vm = new Vue({ el: '#app', data: { msg: 'ok' }, methods: { show(){ console.log("执行了show方法") } }, beforeCreate(){ //这是我们遇到的第一个生命周期函数,表示实例完全被创建出来之前,会执行它 console.log(this.msg) console.log("") this.show() // 注意:在 beforeCreate 生命周期函数执行的时候,data 和 methods 中 数据都还没有初始化 }, created(){ // 这是遇到的第二个生命周期函数 console.log(this.msg) this.show() // 在 created 中, data 和 methods 都已经初始化好了 // 如果要调用 methods 中的方法, 或者操作 data 中的数库, 最早,只能在 created }, beforeMount(){ // 这是遇到的第3个生命周期函数,表示 模板已经在内存中编辑完成了,但是尚未把模板渲染到页面中 console.log(document.getElementById('h3').innerText) // 在 beforeMount 执行的时候,页面中的元素,还没有被真正替换过来,只是之前写的一些模板字符串 }, mounted(){ // 这是遇到的第4个生命周期函数,表示,内存中的模板,已经真实的挂载到了页面中,用户已经可以看到渲染好的页面 console.log(document.getElementById('h3').innerText) // 注意:mounted 是 实例创建期间的最后一个生命周期函数,当执行完 mounted 就表示,实例已经被完全创建好了,此时,如果没有其他操作的话,这个实例,就静静的躺在内存中,一动不动(组件已经脱离了创建阶段,进入到运行阶段) // 如果要通过某些插件操作页面上的DOM节点,最早要在 mounted 中进行 }, // 接下来是运行中的两个事件 beforeUpdate(){ // 这时候,表示 我们的界面还没有被更新(数据更新了) console.log('界面上元素的内容:' + document.getElementById('h3').innerText) // ok console.log('data 中的 msg 数据是:' + this.msg) // No // 得出结论: 当执行 beforeUpdate 的时候,页面中的显示的数据,还是旧的,此时 data 数据是最新的,页面尚未和最新的数据保持同步 } }) </script>