VUE的生命周期

128 阅读2分钟

VUE生命周期指的是vue实例从创建到销毁的过程。

生命周期的几个阶段: 创建阶段执行1次,运行阶段执行0~N次,销毁阶段最多执行1次


  1. 初始化阶段
  • beforeCreate:实例刚创建完成,此时还没有data和methods属性
beforeCreate() {
    // 还未进行数据代理
    // 此时无法通过vm访问data中的数据,methods中的方法
  }
  • created:vue实例data和method属性已经初始化完成,此时还没有编译模板。created在生命周期中非常有用,此阶段获取到了数据但没进行页面结构渲染,常用于调用methods中的Ajax请求和后台请求。
created() {
    //    已完成初始化
    //    可以通过vm访问data中的数据,methods中的方法
  }

  1. 实例挂载阶段
  • beforeMount:挂载前,模板编译完成,此时el还没有挂载,data可见,此阶段还未将编译好的HTML结构渲染到浏览器,所以无法操作Dom。此阶段也能进行Ajax请求,但Ajax请求最早可在created阶段发送,一般越早发送请求拿到数据越好。
beforeMount() {
    //    页面呈现的是未经Vue编译的DOM页面
    //    所有对DOM的操作,最终都不会起作用
  }
  • mounted:挂载完成后,模板编译完成,$el挂载完成,已经把HTML渲染到页面。此阶段是操作当前组件DOM的最早阶段。
mounted() {
    // 页面呈现的是经Vue编译的DOM页面
    // 对DOM的操作,会起作用
  }

  1. 数据更新阶段/运行阶段(最少执行0次,最多无限次)
  • beforeUpdate:数据更新时执行,data数据此时已经是最新的数据,UI界面还是旧的。
beforeUpdate() {
    //    此时数据已更新,但页面还是旧的
    //    数据与页面不一致
  }
  • updated:数据更新完成后,data和界面里的数据此时都是最新的,完成界面的更新渲染render。
updated() {
    //    此时数据和页面都已更新
  },

  1. 销毁阶段
  • beforeDestroy:销毁前,实例准备销毁,此时data和methods方法都能用,组件将要销毁但尚未销毁。
beforeDestroy() {
    //    vm中所有的data、methods、指令都可以用
    //    在此阶段一般进行:关闭定时器,解除自定义事件等操作
  }
  • destroyed:销毁后,实例销毁完成,此时原先创建的属性和实例方法都不可使用,此组件在浏览器中对应的Dom结构已经完全移除了。
destroyed() {
    //   vm中所有的data、methods、指令都不可以用
  }

生命周期的详细执行顺序: 单组件情况下:

  • 进入页面默认会自动执行beforeCreate -> created -> beforeMount ->mounted。
  • 当数据发生改变的前一刻会自动执行beforeUpdate,当数据改变完成会自动执行updated。
  • 当页面准备销毁的前一刻会自动执行beforeDestroy,当页面准备销毁完成会自动执行destroyed。

  • 注意事项:
  • beforeCreate:再执行该函数时,elel、data、methods、computed在this中无法获取
  • created:在执行该函数时,$data、methods、computed在this中可以获取(如果不需要操作DOM可以在此阶段发起网络请求)
  • beforeMount:template准备挂载
  • mounted:在执行该函数时,$el可以在this中访问(可以发起网络请求)

父子组件执行顺序:

  • 进入页面自动执行的生命周期钩子有:
  • 1.首先会自动执行父组件的生命周期钩子beforeCreate -> created -> beforeMount
  • 2.然后会自动执行子组件的生命周期钩子beforeCreate -> created -> beforeMount -> mounted
  • 3.最后再自动执行父组件的生命周期钩子mounted
  • ( 当组件数据发生改变,组件各自执行各自的生命周期钩子beforeUpdate、updated )
  • 当页面被销毁时,父组件会先执行beforeDestroy,子组件再执行beforeDestroy、destroyed,最后父组件执行destroyed