1.组件挂载入口
通过compile转化成render之后,调用mountComponent核心方法进行组件实例的挂载。该函数与生命周期相关,位于beforeMount和mounted生命周期钩子之间。
2.核心方法mountComponent
export function mountComponent(vm, el) {
// 上一步模板编译解析生成了render函数
// 下一步就是执行vm._render()方法 调用生成的render函数 生成虚拟dom
// 最后使用vm._update()方法把虚拟dom渲染到页面
// 真实的el选项赋值给实例的$el属性 为之后虚拟dom产生的新的dom替换老的dom做铺垫
vm.$el = el;
// _update和._render方法都是挂载在Vue原型的方法 类似_init
vm._update(vm._render());
}
核心方法mountComponent中主要调用vm._render和vm._updatte函数进行实例挂载
3.render函数转化成虚拟DOM核心方法_render
通过解构获取生成的render方法,然后call改变this生成vnode。定义_c,_v,_s三个方法,用于创建虚拟DOM,创建虚拟DOM文本,给对象JSON字符串转化。
Vue.prototype._c = function (...args) {
// 创建虚拟dom元素
return createElement(...args);
};
Vue.prototype._v = function (text) {
// 创建虚拟dom文本
return createTextNode(text);
};
Vue.prototype._s = function (val) {
// 如果模板里面的是一个对象 需要JSON.stringify
return val == null
? ""
: typeof val === "object"
? JSON.stringify(val)
: val;
};
虚拟DOM和文本虚拟DOM的函数中通过tag,data,key,children,text属性,调用createElement,createTextNode生成虚拟DOM返回。
4.虚拟DOM转化成真实DOM核心方法_update
在生成虚拟DOM后返回的Vnode作为参数传入_update函数进行转化,通过调用patch
Vue.prototype._update = function (vnode) {
const vm = this;
// patch是渲染vnode为真实dom核心
patch(vm.$el, vnode);
};
在patch函数中调用createElm将虚拟DOM转换成真实DOM,其中通过将el属性指向真实DOM,解析虚拟DOM属性(调用updateProperties给style和props属性进行设置),将子节点递归插入到父节点里面,也是调用createElement函和createTextNode函数进行生成,然后赋值到vnode的el属性里返回
5._render和_update原型方法的混入
initMixin(Vue);
// 混入_render
renderMixin(Vue);
// 混入_update
lifecycleMixin(Vue);
export default Vue;
将定义在原型的方法引入到Vue主文件入口,这样实例化实例的时候可以调用该方法
6.小结
在initMixin函数中调用mount函数挂载组件,将模板转换成render函数,然后通过update函数将render生成的Vnode节点进行patch映射 在渲染完模板后,还会渲染混入的模板,lifecycleMixin,renderMixin,加载的方式与渲染真实模板一样