Vue|Vue核心?(生命周期)


文章目录

  • 生命周期引入
  • 挂载流程
  • 更新流程
  • 销毁流程
  • 生命周期总结

生命周期引入 生命周期
  • 又名:生命周期回调函数、生命周期函数、生命周期钩子。
  • 是什么:Vue在关键时刻帮我们调用的一些特殊名称的函数。
  • 生命周期函数的名字不可更改,但函数的具体内容是程序员根据需求编写的。
  • 生命周期函数中的this指向是 vm 或 组件实例对象。
例如我们现在有一个需求,页面上显示一行文字,并且动态的改变它的透明度。
代码如下:
欢迎学习Vue
type="text/javascript"> Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。new Vue({ el:'#root', data:{ opacity:1 }, methods: {},//通过外部的定时器实现(不推荐) setInterval(() => { vm.opacity -= 0.01 if(vm.opacity <= 0) vm.opacity = 1 },16)

注意:
  • {opacity}使用了对象的简写形式
  • 因为定时器在vm的外面,所以我们要获取opacity就可以通过数据代理从vm上获得
  • 因为小数的运算在js中是不准确的,所以我们没有写成vm.opacity === 0,而是写成vm.opacity <= 0
这样写可以实现功能,但是Vue实例与处理逻辑分开了,且处理逻辑还在操作Vue中的数据。也就是说从功能上来讲两者连在一起,但是从代码层面上来讲,他们俩是割裂开的。我们希望将这个逻辑放入到Vue中去。
此时我们就可以借助生命周期函数。在Vue完成模板的解析并把真实DOM全部挂载到页面上完毕之后,会调用一个mounted()函数,我们可以借助它来完成这个案例:
挂载就是第一次把真实DOM放入到页面中
欢迎学习Vue
type="text/javascript"> Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。new Vue({ el:'#root', data:{ opacity:1 }, methods: {}, //Vue完成模板的解析并把初始的真实DOM元素放入页面后(挂载完毕)调用mounted mounted(){ console.log('mounted',this) setInterval(() => { this.opacity -= 0.01 if(this.opacity <= 0) this.opacity = 1 },16) }, })//通过外部的定时器实现(不推荐) /* setInterval(() => { vm.opacity -= 0.01 if(vm.opacity <= 0) vm.opacity = 1 },16) */

mounted中Vue已经把它的this维护成了vm。所以上面的代码中使用箭头函数的时候,this往外寻找就是vm。
挂载流程 下图中红圈mounted之前的部分都属于挂载部分。
红色圆框对应着生命周期函数
Vue|Vue核心?(生命周期)
文章图片

其中有几个注意点:
Vue|Vue核心?(生命周期)
文章图片

这个地方的create不是指的vm创建,而是数据监测、数据代理的创建
Vue|Vue核心?(生命周期)
文章图片

此处是可以进行DOM操作的,页面的效果也会发生变化。但是紧随其后
Vue|Vue核心?(生命周期)
文章图片

也就是说不管你此时如何操作DOM,当Vue把虚拟DOM转为真实DOM之后,你原来操作的效果都会消失。
template是什么?
例如我们现在有一段代码:
当前的n值是:{{n}}
type="text/javascript"> Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。new Vue({ el:'#root', data:{ n:1 }, methods: { add(){ console.log('add') this.n++ }, },})

我们可以借助template让容器里面什么都不写:
type="text/javascript"> Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。new Vue({ el:'#root', template:`当前的n值是:{{n}} `, data:{ n:1 }, methods: { add(){ console.log('add') this.n++ }, },})

注意:
  • template后面跟字符串
  • 如果不想全写在一行就要使用模板字符串,否则报错
  • Vue会直接把template当作模板执行后面的步骤(解析生成真实DOM·····)。
  • template里面只能有一个根元素,所以我们把他用div包裹(不要使用