(转载)10分钟彻底搞懂前端页面性能监控
(转载)全面分析总结JS内存模型
Vue2.x(含组件)主流程源码笔记(十):destroyed 阶段
上两章分析了 Vue
的 update
阶段,本章我们以点击 点击让第二个App组件卸载
触发 hide
执行 this.isShow = false
为例,分析 Vue
的 destroyed
阶段。
前面逻辑同 update
阶段一致,触发该属性的订阅即 渲染 watcher
执行 run
方法,在 updateComponent
里先执行 vm._render
得到最新 vnode
,然后执行 vm._update
更新 dom
。
在 updateChildren
循环里遍历比较子 vnode
,可以看出只有最后一个 vnode
不同:旧 vnode
为 App
组件 vnode
,新 vnode
为注释 vnode
。 则先调用 createElm
根据注释 vnode
创建真实 dom
并插入到对应位置;然后在 while
下次循环时,对旧的 App
组件 vnode
执行 removeVnodes
移除。
removeVnodes
1 | function removeVnodes(vnodes, startIdx, endIdx) { |
Vue2.x(含组件)主流程源码笔记(九):update 阶段(下)
接上文,得到 vnode
后执行 vm._update
。因为 vm._vnode
存在即已经渲染过,则走更新方法:
1 | // updates |
vm.__patch__
即 patch
方法,进入 patch
流程。
sameVnode
1 | function sameVnode(a, b) { |
Vue2.x(含组件)主流程源码笔记(八):update 阶段(上)
前面七章分析了 vue demo
的整个初始化过程,本文开始分析当数据(model
)发生变化时,Vue
的处理过程。
我们以点击 dom
触发 plus
执行 this.info.age++
为例,分析 Vue
的 update
阶段。
proxyGetter && proxySetter
此时读取 this.info
,则触发在 ininState->initData->proxy(vm, "_data", key)
监听的 proxyGetter
:
1 | function proxy(target, sourceKey, key) { |
Vue2.x(含组件)主流程源码笔记(七):mount 阶段之生成 dom
vnode 渲染为真实 dom
接上文,vm._render
通过 render
生成 vnode
后,然后执行 vm._update(vm._render(),hydrating)
来首次渲染成真实 dom
,里面执行:
1 | if (!prevVnode) { |
此处为初始渲染,执行第一个分支 vm.__patch__(vm.$el, vnode, hydrating, false /* removeOnly */);
即执行 patch
。
patch
中因为 oldVnode
即 vm.$el
是真实节点,则 oldVnode
替换为空 vnode
,然后执行:
Vue2.x(含组件)主流程源码笔记(六):mount 阶段之生成 vnode
Vue2.x(含组件)主流程源码笔记(五):beforeMount 阶段
Vue2.x(含组件)主流程源码笔记(四):created 阶段
接上文继续分析,在触发生命周期钩子 beforeCreate
后,执行:
1 | initInjections(vm); // resolve injections before data/props |
initInjections
依赖注入,用于层级组件间传值,不可响应。
判断是否存在 $options.inject
,然后在 resolveInject
里递归向上各级父元素中查找 vm._provided
属性值里是否有对应的注入值。找到最新值后放在实例下监听, set
方法设置无法重写,即不能更改注入值。