Vue 的 ​​_render​​ 方法是实例的一个私有方法,它用来把实例渲染成一个虚拟 Node  ,返回的是一个VNode  

 

在 Vue 的官方文档中介绍了 ​​render​​ 函数的第一个参数是 ​​createElement​​,那么结合之前的例子:



<div id="app">
{{ message }}
</div>


相当于我们编写如下 ​​render​​ 函数:



render: function (createElement) {
return createElement('div', {
attrs: {
id: 'app'
},
}, this.message)
}


再回到 ​​_render​​ 函数中的 ​​render​​ 方法的调用:



vnode = render.call(vm._renderProxy, vm.$createElement)


可以看到,​​render​​ 函数中的 ​​createElement​​ 方法就是 ​​vm.$createElement​​ 方法:



export function initRender (vm: Component) {
// ...
// bind the createElement fn to this instance
// so that we get proper render context inside it.
// args order: tag, data, children, normalizationType, alwaysNormalize
// internal version is used by render functions compiled from templates
vm._c = (a, b, c, d) => createElement(vm, a, b, c, d, false)
// normalization is always applied for the public version, used in
// user-written render functions.
vm.$createElement = (a, b, c, d) => createElement(vm, a, b, c, d, true)
}


实际上,​​vm.$createElement​​ 方法定义是在执行 ​​initRender​​ 方法的时候,可以看到除了 ​​vm.$createElement​​ 方法,还有一个 ​​vm._c​​ 方法,它是被模板编译成的 ​​render​​ 函数使用,而 ​​vm.$createElement​​ 是用户手写 ​​render​​ 方法使用的, 这俩个方法支持的参数相同,并且内部都调用了 ​​createElement​​ 方法。

#总结


越努力越幸运