重新补一下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
是微任务,所以俩宏任务是分开执行的? - 思考下