vue 生命周期

vue生命周期

Vue实例从开始创建、初始化数据、编译模板、挂载Dom->渲染、更新->渲染、写在等一系列过程,我们称这是Vue的生命周期,各个阶段有相对应的事件钩子

1.生命周期钩子函数

下面这张图是vue生命周期各个阶段的执行情况

生命周期钩子 组件状态 最佳实践
beforCreate 实例初始化之后,this指向创建的实例,不能访问到data、computed、watch、methods上的方法和数据 常用于初始化非响应式变量
created 实例创建完成,可访问data、computed、watch、methods上的方法和数据,未挂载DOM,不能访问$el属性,$el属性内容为空数组 常用于简单的ajax请求,页面的初始化
beforeMount 在挂载开始之前被调用,beforeMount之前,回找到对应的template,并编译成render函数
mounted 实例挂载到DOM上,此时可以通过DOM API获取到DOM节点,$ref属性可以访问 常用于获取VNode信息和操作,ajax请求
beforeUpdate 响应式数据更新时调用,发生在虚拟DOM打补丁之前 适合更新之前访问现有的DOM,比如手动移除已添加的事件监听
update 虚拟DOM重新渲染和打补丁之后调用,组件DOM已经更新,可执行依赖于DOM的操作 避免在这个钩子中操作数据,否则可能陷入死循环
beforeDestroy 实例销毁之前调用。这一步,实例仍然完全可用,this仍能获取到实例 常用于销毁定时器、解绑全局事件、销毁插件对象等操作
destroyed 实例销毁后调用,调用后,Vue实例指示的所有东西都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁

注意:

  • created阶段的ajax请求与mounted请求的区别:前者页面视图未出现,如果请求信息过多,页面会长时间处于白屏状态
  • mounted不会承诺所有的子组件也都一起被挂载。如果你希望等到整个视图都渲染完毕,可以使用vm.$nextTick
  • vue2.0之后主动调用$destroy()不会一处dom节点,不推荐直接destroy这种做法,如果实在需要这样用,可以在这个生命周期钩子中手动移除dom节点
  • beforeupdate和updated:响应式属性必须在template模板中使用,他们才会执行

2.单个组件的生命周期

<template>
  <div>
   {{name}}
   <button @click="destroy">销毁</button>
   <button @click="change">更改name</button>
  </div>
</template>

<script>
export default {
  data(){
    return {
      name:'我是组件'
    }
  },
  beforeCreate(){
    this.comName = 'M'
    console.log(this.comName,'---beforeCreate');
  },
  created(){
    console.log(this.name,'---created')
  },
  beforeMount(){
    console.log(this.comName,'---beforeMount')
  },
  mounted(){
    console.log(this.name,'---mounted')
  },
  beforeUpdate(){
    console.log(this.name,'---beforeUpdate')
  },
  updated(){
    console.log(this.name,'---updated')
  },
  beforeDestroy(){
    console.log(this.name,'---beforeDestroy')
  },
  destroyed(){
    console.log(this.name,'---destroyed')
  },
  methods:{
    destroy(){
      this.$destroy()
    },
    change(){
      this.name = '哈哈'
    }
  }
}

初始化
// M ---beforeCreate
// 我是组件 ---created
// M ---beforeMount
// 我是组件 ---mounted


点击更改name按钮
// 哈哈 ---beforeUpdate
// 哈哈 ---updated

点击销毁按钮
// 哈哈 ---beforeDestroy
// 哈哈 ---destroyed

从打印结果可以看出

  • 初始化组件时,仅执行了beforeCreate/created/beforeMount/mounted这四个钩子函数
  • 当改变data中定义的变量(响应式变量)时,会执行beforeUpdate/updated钩子函数
  • 当销毁组件时,会执行beforeDestory/destoryed钩子函数
  • 初始化和销毁时的生命周期钩子函数均只会执行一次,beforeUpdate/update可执行多次
原文地址:https://www.cnblogs.com/mengxiangji/p/10763044.html