0
点赞
收藏
分享

微信扫一扫

24 VueComponent 的 render


 前言 

这是最近的碰到的那个 和响应式相关的问题 特定的操作之后响应式对象不“响应“了 引起的一系列的文章 

主要记录的是 vue 的相关实现机制 

呵呵 理解本文需要 vue 的使用基础, js 的使用基础 

 测试用例

测试用例如下, 一个简单的 按钮事件的触发  

24 VueComponent 的 render_vue

问题的调试

编译之后的 render 如下 

这里可以看到的是 最末层级 的展示节点的创建, 是作为 el-card 的一个 slot 传入的 

24 VueComponent 的 render_vue_02

ElCard 模板定义如下

24 VueComponent 的 render_js_03

编译之后的 render 如下 

24 VueComponent 的 render_js_04

从以上相关的代码, 大致是可以 复现出 HelloWorld 整个 VNode 树了 

一个 div, 下面三个子节点, 一个 el-card, 一个 br, 一个 el-button

没有递归渲染

24 VueComponent 的 render_子节点_05

以下是 el-card 渲染的整颗树形结构

一个 div, 下层两个子节点, 一个 el-card__header, 一个 el-card__body

这里没有 el-card__header, 创建的一个 空节点 

el-card__body 下面有一个 HelloWorld.vue 传入的 TextNode 子节点

24 VueComponent 的 render_vue_06

整个过程中构建页面 dom 元素的过程

在 createElm 中创建各个 dom 元素, 并添加到给定的 元素下面

一部分 textNode, commentNode 是在外面 createElm 创建的

24 VueComponent 的 render_测试用例_07

之所以这部分 不满足 if 条件的 页面显示为注释, 是因为 创建该节点的 vnode 使用的是 createEmptyVNode, 里面设置了 isComment 为 true

然后在 createElm 中看到这个 vnode.isComment 为 true, 创建了注释节点

24 VueComponent 的 render_测试用例_08

举报

相关推荐

0 条评论