回顾生命周期
视图阶段
1.beforeCreate实例未生成,访问不到this,一般用于设置title,keywords等;
也可以用于路由权限控制拦截;
2.create;组件实例生成,处于未挂载阶段;组件首次访问data,methods等;一般用于数据初始化,ajax请求;
3.Beforemount template模板的编译,从而形成相应的render函数在;组件挂载前;这时实例依然未挂载,访问不到dom中的data
4.mounted template模板已经真实的挂载到了页面中,用户已经可以看到渲染好的页面了
数据更新阶段
5. beforeUpdate 页面中的显示的数据,还是旧的,此时 data 数据是最新的,页面尚未和最新的数据保持同步
6. updated由于数据更改导致的虚拟 DOM 重新渲染和打补丁,在这之后会调用该钩子。当这个钩子被调用时,组件 DOM 已经更新,所以你现在可以执行依赖于 DOM 的操作。
销毁阶段
7. beforeDestroy实例销毁之前调用。在这一步,实例仍然完全可用。
8.destroyed:组件的数据绑定、监听...都去掉了,只剩下dom空壳
特殊钩子: activated 与 deactivated--- keep-alive包含的组件
被keep-alive包含的组件/路由中,会多出两个生命周期的钩子:activated 与 deactivated。
activated调用时机:
activated在组件第一次渲染时会被调用,之后在每次缓存组件被激活时调用。
第一次进入缓存路由/组件,在mounted后面,beforeRouteEnter守卫传给 next 的回调函数之前调用:
beforeMount=> 如果你是从别的路由/组件进来(组件销毁destroyed/或离开缓存deactivated)=>mounted=> activated 进入缓存组件 => 执行 beforeRouteEnter回调
再次进入缓存路由/组件时,不会触发这些钩子:// beforeCreate created beforeMount mounted 都不会触发。
Deactivated调用时机:
组件被停用(离开路由)时调用
使用了keep-alive就不会调用beforeDestroy和destroyed,因为组件没被销毁,被缓存起来了。
组件内的离开当前路由钩子beforeRouteLeave => 路由前置守卫 beforeEach =>全局后置钩子afterEach => deactivated 离开缓存组件
问题1
结论:1.父子组件加载渲染过程的顺序è父created->子created->子mounted->父mounted
2.父组件在mounted中的赋值操作,子组件在created和mounted中拿不到
问题2
结论
1.父子组件的执行顺序父beforeUpdate->子beforeUpdate->子updated->父updated
2.子组件中用beforeupdata周期接受数据更为保险