# Vue主线剧情之createElement

# 前言

上回说到 render 函数最终是执行 createElement 方法,返回 vnode 节点。这次就让我们来看看 createElement 内部做了些什么。

# 源码及分析

src/core/instance/render.js 中看到了, createElement 方法在 src/core/vdom/create-element.js 文件中。

点击查看createElement源码

看源码第一步,抓重点:

  • createEmptyVNode 创建空的vnode
  • createComponent 创建组件
  • normalizeChildren 规范的children
  • simpleNormalizeChildren 简单的规范的children

第二步,看一下执行步骤:

  • 判断tag是否存在,不存在则创建一个空节点
  • 如果传递了children, 根据 normalizationType 调用 normalizeChildren(children) / simpleNormalizeChildren(children)
  • 对参数 tag 的判断, 如果是一个普通的 html 标签,实例化为一个VNode节点,如果是 component 则通过 createComponent 创建一个组件的 vnode。

这里可能需要自己再去揣摩一下,大概就是把普通的VNode节点和组件的VNode做一个分别创建

# 总结

因为除了组件的 vnode 没有 children,而其他通过 createElement 创建的每个 vnode 都有 children,并且 children 每个元素也是一个 vnode

这样就形成了一个完整的 vnode tree,这样我们就知道 vm._render 阶段是如何创建的 vnode。

那么接下来我们就去看看 vm._update,看看是如何将 vnode 渲染成真实 dom 的。

# 致谢

感谢大家阅读我的文章,如果对我感兴趣可以点击页面右上角,帮我点个star。

作者:前端小然子

链接: https://xiaoranzife.com/guide/vue/createElement.html

来源:前端小然子的博客

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

上次更新: 2019-11-21 4:58:06 ├F10: PM┤