vue 如何生成一个dom元素_vue 源码学习三 vue中如何生成虚拟DOM

本文详细解析Vue.js实例的`_render`方法,阐述了如何生成虚拟DOM。首先,`_render`调用`render`函数,通过`vm._renderProxy`和`vm.$createElement`处理。接着,分析了`vm._renderProxy`的实现,特别是在生产环境和开发环境中的区别。然后,探讨了虚拟DOM的概念及其在Vue中的表示。最后,深入`createElement`函数,展示了如何处理参数和创建VNode,以及对children的扁平化处理。通过这些步骤,理解了Vue如何将实例转换为VNode,为后续的DOM更新奠定基础。
摘要由CSDN通过智能技术生成

vm._render 生成虚拟dom

我们知道在挂载过程中, $mount 会调用 vm._update和vm._render 方法,vm._updata是负责把VNode渲染成真正的DOM,vm._render方法是用来把实例渲染成VNode,这里的_render是实例的私有方法,和前面我们说的vm.render不是同一个,先来看下vm._render定义,vm._render是通过renderMixin(Vue)挂载的,定义在src/core/instance/render.js:

// 简化版本

Vue.prototype._render = function (): VNode {

const vm: Component = this

const { render, _parentVnode } = vm.$options

...

// render self

let vnode

try {

// _renderProxy生产环境下是vm

// 开发环境可能是proxy对象

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

} catch (e) {...}

// return empty vnode in case the render function errored out

if (!(vnode instanceof VNode)) {

if (process.env.NODE_ENV !== 'production' && Array.isArray(vnode)) {...}

vnode = createEmptyVNode()

}

// set parent

vnode.parent = _parentVnode

return vnode

}

先缓存vm.$options.render和vm.$options._parentVnode,vm.$options.render是在上节的$mount中通过comileToFunctions方法将template/el编译来的。

vnode = render.call(vm._renderProxy, vm.$createElement)调用了render方法,参数是vm._renderProxy,vm.$createElement

拿到vnode后,判断类型是否为VNode,如果有多个vnode,则是模板上有多个根节点,触发告警。

挂载vnode父节点,最后返回vnode

简要概括,vm._render函数最后是通过render执行了createElement方法并返回vnode;下面就来具体看下vm._renderProxy,vm.$createElement,vnode

vm._renderProxy

首先来看下vm._renderProxy,vm._renderProxy是在_init()中挂载的:

Vue.prototype._init = function (options?: Object) {

...

if (process.env.NODE_ENV !== 'production') {

// 对vm对一层拦截处理,当使用vm上没有的属性时将告警

initProxy(vm)

} else {

vm._renderProxy = vm

}

...

}

如果是生产环境,vm._renderProxy直接就是vm;开发环境下,执行initProxy(vm),找到定义:

initProxy = function initProxy (vm) {

if

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值