vue render函数_Vue源码全面解析三十六 _render函数(生成vnode虚拟DOM结构)

8dba0b76ec0a90b38c394c0e90ed1d85.png

我们打开“src/core/instance/render.js”文件,代码如下:

Vue.prototype._render = function (): VNode {    const vm: Component = this    const { render, _parentVnode } = vm.$options    if (_parentVnode) {      vm.$scopedSlots = normalizeScopedSlots(_parentVnode.data.scopedSlots,vm.$slots, vm.$scopedSlots)    }    vm.$vnode = _parentVnode    // render self    let vnode    try {      currentRenderingInstance = vm      vnode = render.call(vm._renderProxy, vm.$createElement)    } catch (e) {          // ...省略部分代码           } finally {      currentRenderingInstance = null    }    if (Array.isArray(vnode) && vnode.length === 1) {      vnode = vnode[0]    }    if (!(vnode instanceof VNode)) {      if (process.env.NODE_ENV !== 'production' && Array.isArray(vnode)) {        warn( 'Multiple root nodes returned from render function. Render function ' +'should return a single root node.', vm)      }      vnode = createEmptyVNode()    }    vnode.parent = _parentVnode    return vnode  }

我们接下来拆分一下该函数的代码:

 const { render, _parentVnode } = vm.$options if (_parentVnode) {   vm.$scopedSlots = normalizeScopedSlots(_parentVnode.data.scopedSlots,vm.$slots, vm.$scopedSlots) }vm.$vnode = _parentVnode

首先是看看是否存在 “_parentVnode” ,如果存在,就调用 “normalizeScopedSlots” 处理 “slot”参数。

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

紧接着调用 render 函数生成 vnode 虚拟节点。render函数代码如下:

6efcd572cbb5955b854a691369215f04.png

最后生成的vnode结构如下:

0fa1dd5807d8e5b8661953a1551e6a62.png
   if (Array.isArray(vnode) && vnode.length === 1) {      vnode = vnode[0]    }    if (!(vnode instanceof VNode)) {      if (process.env.NODE_ENV !== 'production' && Array.isArray(vnode)) {        warn( 'Multiple root nodes returned from render function. Render function ' +'should return a single root node.', vm)      }      vnode = c    }

以上就是生成vnode之后的处理。

1、取出vnode对象的打一个(vnode[0])

2、判断vnode 是否为 Vnode的实例化对象,如果不是将新建一个空的vnode (createEmptyVNode())

 vnode.parent = _parentVnodereturn vnode

最后是设置vnode的父级,然后返回vnode。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值