vue 如何生成一个dom元素_Vue源码全面解析二十四 createElm函数(创建真实DOM元素)...

本文详细分析了Vue.js源码中createElm函数的实现过程,该函数负责创建真实DOM元素并插入到文档中。首先,检查vnode是否已渲染,然后判断是否为根元素插入,并处理组件创建。接着,根据vnode的tag创建DOM元素,处理子集及数据属性,并调用相关钩子函数。最后,将生成的DOM元素插入到父元素中。整个过程涉及虚拟DOM到真实DOM的转换、DOM操作及生命周期管理。
摘要由CSDN通过智能技术生成
b29ef4f5422fc869119663f08e7d2e3e.png

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

function createElm ( vnode, insertedVnodeQueue, parentElm,refElm,nested,ownerArray,index ) {    if (isDef(vnode.elm) && isDef(ownerArray)) {      vnode = ownerArray[index] = cloneVNode(vnode)    }    // 是否为根元素插入    vnode.isRootInsert = !nested // for transition enter check    // 如果是组件,直接 return    if (createComponent(vnode, insertedVnodeQueue, parentElm, refElm)) {      return    }    // data属性    const data = vnode.data    // 子集    const children = vnode.children    // 标签名称    const tag = vnode.tag        if (isDef(tag)) {      if (process.env.NODE_ENV !== 'production') {        if (data && data.pre) {          creatingElmInVPre++        }        if (isUnknownElement(vnode, creatingElmInVPre)) {          warn(            'Unknown custom element:  - did you ' +            'register the component correctly? For recursive components, ' +            'make sure to provide the "name" option.',            vnode.context          )        }      }      vnode.elm = vnode.ns  ? nodeOps.createElementNS(vnode.ns, tag) : nodeOps.createElement(tag, vnode)      setScope(vnode)      /* istanbul ignore if */      if (__WEEX__) {               // ... 省略部分weex平台代码              } else {        createChildren(vnode, children, insertedVnodeQueue)        if (isDef(data)) {          invokeCreateHooks(vnode, insertedVnodeQueue)        }        insert(parentElm, vnode.elm, refElm)      }      if (process.env.NODE_ENV !== 'production' && data && data.pre) {        creatingElmInVPre--      }    } else if (isTrue(vnode.isComment)) {      vnode.elm = nodeOps.createComment(vnode.text)      insert(parentElm, vnode.elm, refElm)    } else {      vnode.elm = nodeOps.createTextNode(vnode.text)      insert(parentElm, vnode.elm, refElm)    }  }

该函数主要是生成真实DOM元素,然后插入文档中,我们来拆分一下该函数。

 if (isDef(vnode.elm) && isDef(ownerArray)) {      vnode = ownerArray[index] = cloneVNode(vnode)    }

如果 “vnode.elm” 存在,说明该vnode已被渲染过了。

"ownerArray" 参数主要是在新增 vnode 或者创建子集的时候存在。

// 是否为根元素插入vnode.isRootInsert = !nestedcif (createComponent(vnode, insertedVnodeQueue, parentElm, refElm)) {  return}

根据 vnode 的 tag 字段创造真实的DOM元素。

调用该函数创建DOM元素:document.createElement(tagName)

createChildren(vnode, children, insertedVnodeQueue)

根据 children 元素生成DOM元素。

内部还是循环调用 createElement

invokeCreateHooks(vnode, insertedVnodeQueue)

调用创建钩子(create),或者插入钩子(insert)。

 insert(parentElm, vnode.elm, refElm)

插入DOM元素。

调父级DOMd的appendChild方法插入vnode.elm

以上createElm函数的代码基本分析完了,如有错误欢迎指正,谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值