生命周期:从开始创建、初始化数据、编译模版、挂载Dom -> 渲染、更新 -> 渲染、卸载 等⼀系列过程。
在创建之前,vue做了两件事:methos声明,生命周期钩子函数声明。
- 创建(data数据注入,data数据劫持
- 遍历递归data选项,给每个声明式变量添加setter/getter。
- 把劫持过变量都放在组件实例上)。
beforeCreate( 创建前 ):有this,但此时data、methods、computed以及watch上的数据和方法还未初始化,都不能被访问。
created( 创建后 ):此时的data 和 methods 都已经被初始化,但是没有$el,dom节点。
作用:ajax请求 定时器 事件监听(window)。
- 挂载(vue做了下面的事(vue引擎第一次工作)
- 根据render()渲染函数,生成“抽象语法树AST”(此时还是带有指令的),再把AST第一次创建成“虚拟DOM(VNode1)”(Vnode是真实DOM的一种数据描述,它本质上是json格式的数据)。
- 根据Vnode1创建真实DOM(第一次接触,收集依赖,watcher发生在此处)把那些声明式变量全部替换成真实数据,DOM渲染完成)。
beforeMount 挂载前:template 模板已导入渲染函数编译。此时虚拟Dom已经创建完成,即将开始渲染。在这一阶段也可以对数据进行更改。
mounted 挂载后:在挂载完成后发生,此时真实的Dom挂载完毕,数据完成双向绑定,可以访问到、Dom节点,使用$refs属性对Dom进行操作。
作用:操作节点、ajax请求 ,开启定时器、订阅消息、绑定自定义事件等初始化操作
- 更新(vue做了以下事情:
- 当vue上下文的data发生变化时,使用render()渲染函数在生成一新的Vnode2。
- 使用大名鼎鼎的Diff运算,patch(old Vnode,new Vnode),找出两个Vnode最小差异,合并Vnode,生成新的Vnode,删除旧的Vnode。
- notify通过Watcher根据"依赖收集"在此更新真实DOM)
beforeUpdate 更新前:会执行多次 数据更新 dom节点没有更新。
updated 更新完毕:会执行多次 数据更新,dom节点也更新。
- 销毁(vue做了如下事情:
- 拆卸掉了Watcher,所以DOM不可能再发生更新。
- 拆卸掉当前组件的所有子组件,所以这些子组件也会经入销毁阶段。
- 卸载掉当前组件中的事件处理器)
beforeDestroy 销毁前:数据可以更新 视图已经不更新。
作用:此时,vm中的所有都处于可用状态,马上要执行销毁过程。一般在此阶段:移除事件监听、关闭定时器,取消订阅消息 解绑自定义事件等收尾操作。destoryed 销毁后:没有this,切换视图与vue实例的联系。
面试题:https://blog.csdn.net/weixin_45836841/article/details/131376979?spm=1001.2014.3001.5502