当前位置: 首页 > article >正文

vue源码分析(六)——vnode 和 createElement的使用和作用

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、Vnode是什么?
  • 二、create-element.ts文件
    • 1.createElement 方法
    • 2. _createElement 方法
      • (1)createEmptyVNode 方法
      • (2)normalizeChildren 和simpleNormalizeChildren 方法
      • (3)_render 函数的返回值
    • 3.createElement 方法最终返回
  • 总结


前言

提示:这里可以添加本文要记录的大概内容:

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


提示:以下是本篇文章正文内容,下面案例可供参考

一、Vnode是什么?

路径 :src\core\vdom\vnode.ts
定义:VNode 就是对真实Dom 的一种抽象描述。由于VNode只是用来映射到真实DOM的渲染,不需要操作DOM的发方法,导致VNode 非常的轻量和简单。而VNode 的创建就是之前提到的createElement方法创建的。也就是该文章所讲的重点。

在这里插入图片描述

如上图:其实重要的VNode 的属性不过就是tag(标签)、data(存储相关的数据)、children(VNode的子节点) 等。

二、create-element.ts文件

路径:src\core\vdom\create-element.ts

1.createElement 方法

参数说明:content vm的实例
tag vnode 的标签(可以判断vnode是不是组件)
data vnode 相关的数据
children vnode的子组件
在这里插入图片描述

本质上是一个处理_createElement 方法参数的方法。在createElement最后面会返回_createElement方法。

2. _createElement 方法

(1)createEmptyVNode 方法

路径:src\core\vdom\vnode.ts
如果没有tag的话,就创建一个vnode,这个方法在vnode.ts文件中。方法中new VNode ,然后返回这个VNode。

在这里插入图片描述
在这里插入图片描述

(2)normalizeChildren 和simpleNormalizeChildren 方法

路径:src\core\vdom\helpers\normalize-children.ts
simpleNormalizeChildren 就是遍历,如果遍历的item还是数组类型,就通过数组的concat方法将两个数组拼成一个,也就是将一个可能是多维数组变成一维数组,也就是所谓的扁平化数组逻辑。

normalizeChildren方法(里面的方法在多个文件中且比较简单,就不贴图详细说明了
isPrimitive判断是不是基础数据类型的方法。
    是基础数据类型就执行createTextVNode(children)方法,实例化一个vnode,将基础数据的文本(children)创建成一个vnode。也就是创建一个文本为children的vnode。
isArray 判断是不是数组的方法。
    不是基础数据类型就执行normalizeArrayChildren方法,也就是返回一个一维的数组。当然了,normalizeArrayChildren的逻辑考虑的比较多,如果数组里面有数组,就会扁平,如果是多个基础数据类型,还是创建一个新的文本VNode。

在这里插入图片描述

(3)_render 函数的返回值

vue2 项目中就是通过div的app来在页面上创建了一个文本vnode,也就是下面的new VNode 逻辑。

在这里插入图片描述
在这里插入图片描述

3.createElement 方法最终返回

createComponent方法 这个由于内容较多,会在下一篇文章中详细说明
在这里插入图片描述

总结

描述了vue2项目在render中创建一个文本vnode发生的事情,通过这个逻辑了解vnode和createElement的使用和作用。


http://www.kler.cn/a/108527.html

相关文章:

  • Keil基于ARM Compiler 5的工程迁移为ARM Compiler 6的工程
  • 前端vue 列表中回显并下拉选择修改标签
  • 图论-代码随想录刷题记录[JAVA]
  • Elasticsearch 8.16:适用于生产的混合对话搜索和创新的向量数据量化,其性能优于乘积量化 (PQ)
  • 应用于新能源汽车NCV4275CDT50RKG车规级LDO线性电压调节器芯片
  • 【专题】计算机网络之网络层
  • SQL-正则表达式和约束
  • redis中的io多线程(线程池)
  • SQLSmith: Databend 如何利用随机化测试检测 Bug
  • 广东木模板批发,建筑桥梁工程专用组合木模板
  • Linux 命令|服务器相关
  • 从裸机到嵌入式Linux—为什么所有芯片启动都是汇编语言开始
  • 如何在filters中使用data中数据?
  • 工程建筑模板厂家货源,酚醛胶镜面胶合板实用型
  • 矩阵特征值与特征向量的理解
  • 深度强化学习用于博弈类游戏-基础测试与说明【1】
  • TCP / UDP 概念 + 实验(计网自顶向下)
  • 深度学习中的epoch, batch 和 iteration
  • 搭建微信小程序环境及项目结构介绍
  • Unity之ShaderGraph如何实现科幻空气墙
  • java中Map常见的面试问题,扩容问题,转红黑树的前提,解决Hash哈希冲突的方法
  • React-表单受控绑定和获取Dom元素
  • 基于群居蜘蛛算法的无人机航迹规划
  • 系统架构设计师-第16章-嵌入式系统架构设计理论与实践-软考学习笔记
  • 负载均衡的综合部署练习(hproxy+keepalived和lvs-DR+keepalived+nginx+Tomcat)
  • 漏洞复现-jquery-picture-cut 任意文件上传_(CVE-2018-9208)