vue 生命周期

重新补一下vue2的基础使用,对之前掌握的使用方法进行下回顾和查漏补缺

生命周期

创建阶段

beforeCreate

Created

  • beforeCreate与Created之间,实例将定义的data、methods等初始化并进行注入。
  • 因此在Created阶段,控制台已经能够输出data、computed值,包括控制台输出的方法methods,这些值都已在当前father组件实例中定义生成了。
  • 此时只是在js操作了vue实例,dom中的元素还并未挂载,因此实例的$el并不能够调用outerHTML
  • 此时子组件child生命周期还未开始!
  • 由于data数据、methods方法等在created中已被定义,此时已经可以去做一些ajax请求后台数据

beforeMount

  • fathe组件的beforeMount时,child子组件的vue创建生命周期已经完成到mounted阶段。说明father在执行dom模板渲染的时候,会监测模板中是否有自定义的vue子组件。如果有,就进入子组件的生命周期的创建阶段,等到所有子组件的完成创建并挂载(mounted)到父组件的模板当中后。才能表明父组件在内存中的模板渲染完成。
  • 子组件的mounted阶段虽然完成,但父组件仍在beforeMounte阶段时。前台也看不见子组件渲染的效果,子组件只是完成了挂载到父组件的模板中了(控制台可以看到dom树中的元素并未变化)。因此此刻在子组件的mounted阶段直接调用一些方法(dom操作方法)可能会造成异常错误。为保险起见可在子组件中通过 $nextTick() 回调,等下一次DOM更新后再进行dom的操作。

mounted

运行阶段

beforeUpdate

update

注销阶段

  • 若一个组件被判断为销毁,则进入相应的销毁阶段。一般情况下销毁阶段的调用有:
    • v-if = ‘false’
    • v-for 列表发生了变化(列表中部分item不再使用)
    • 实例调用 $destroy() 方法( 官方建议,$destroy 在多数情况下,还是用 v-if 和 v-for 来替代 )

beforeDestroy

  • 在该阶段,实例的属性、方法、事件等仍然可以调用。

destroyed


生命周期中同步执行异步代码

  • 我们常用的钩子函数 created、mounted 如果加了async,await,想要同步执行代码,代码必须放在同一个钩子函数里面
  • 例子:你在created里放一个await a(),在mounted里放一个await b(),你期望的a执行以后再执行b是不成立的,你必须将a()b()放在同一个钩子函数里
  • 原因猜想:这可能是由于vue的各个钩子函数是各个不同的宏任务,放进钩子函数的async/await是微任务,所以俩宏任务是分开执行的?
  • 思考下