zoukankan      html  css  js  c++  java
  • 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可执行多次
  • 相关阅读:
    关于Unity中的NavMeshAgent的remainingDistance问题
    关于Unity中MonoBehaviour的构造函数
    【Unity】Domina-Game总结与反思
    初步理解IOC和DI和AOP模式
    简单并查集归纳
    括号匹配-记错心得
    Django博客项目思路整理
    找零问题
    连续子序列最大和的O(NlogN)算法
    Python-demo(photo)
  • 原文地址:https://www.cnblogs.com/mengxiangji/p/10763044.html
Copyright © 2011-2022 走看看