本小节将解析当我们使用new Vue的时候,Vue做了哪些事情
Vue.js一个核心思想就是数据驱动。视图是由数据驱动生成的,我们对视图的修改不会直接操作DOM,而是通过数据的修改。比我们传统的开发方式,大大简化了代码
这节主要分析$mount
如何把数据渲染到DOM上
$mount
定义
我们使用的是runtime
+compiler
版本,入口文件在web/entry-runtime-width-compiler.js
中
1 | const mount = Vue.prototype.$mount |
可以看出,在这个文件中,先缓存了Vue
原型上的$mount
方法,之后又重新定义了$mount
方法,最终调用了之前的$mount
方法
1 | // runtime/index.js |
原始$mount
方法,关键会执行到vm._update(vm._render(), hydrating)
1 | // core/instance/lifecycle.js |
_update
参数1vm._render
生成vnode过程,调用createElement
1 | // core/instance/render.js |
$createElement
执行vm._render
时会执行vnode = render.call(vm._renderProxy, vm.$createElement)
在这里定义了vm.$createElement
方法
1 | // 在init时执行 core/instance/render.js |
createElement
1 | export function createElement ( |
_createElement
1 | export function _createElement ( |
vm._update
有两个调用时机,初始化时,渲染到真实dom;数据改变时,驱动视图变化,调用
1 | Vue.prototype._update = function (vnode: VNode, hydrating?: boolean) { |
__patch__
1 | // runtime/index.js |
在浏览器环境下是patch
1 | // runtime/patch.js |
createPatchFunction
最终调用了createElm
,真正把vnode渲染到dom上
1 | // core/vdom/patch |