框架vnode,工厂模式实现的例子

工厂模式,

vue3

<div><span>静态文字</span><span :id="hello" class="bar">{{ msg }}</span>
</div>
import { createElementVNode as _createElementVNode, toDisplayString as _toDisplayString, openBlock as _openBlock, createElementBlock as _createElementBlock } from "vue"export function render(_ctx, _cache, $props, $setup, $data, $options) {return (_openBlock(),_createElementBlock("div", null,[_createElementVNode("span", null, "静态文字"),_createElementVNode("span", {id: _ctx.hello,class: "bar"},_toDisplayString(_ctx.msg), 9 /* TEXT, PROPS */, ["id"])]))
}// Check the console for the AST

这段代码是使用Vue 3的Composition API风格编写的一个组件渲染函数。下面是对这段代码的详细解释:

  1. 导入Vue渲染函数: 首先,从"vue"模块中导入了几个用于创建和操作虚拟DOM节点的核心函数,这些函数被重命名以遵循一些编程习惯或压缩时的优化

   - createElementVNode 重命名为 _createElementVNode:用于创建元素类型的虚拟节点。
   - toDisplayString 重命名为 _toDisplayString:用于将JavaScript值转换为字符串,以便在DOM中显示。

这些函数与 Vue 的块追踪和性能优化有关:

  - openBlock 重命名为 _openBlock:标志着一个新渲染块的开始,主要用于Vue内部的渲染作用域管理。
   - createElementBlock 重命名为 _createElementBlock:用于创建带有多个子节点的元素类型虚拟节点,常用于创建具有多个子元素的块。

  1. render函数定义: 这是Vue组件的核心渲染逻辑所在的方法。它接收几个参数:
       - _ctx: 组件实例的上下文对象,包含数据、属性等。
       - _cache: Vue内部使用的缓存对象,帮助优化更新性能。
       - props: 组件接收的外部属性。
       - setup: 如果有的话,来自setup()函数返回的数据和方法。
       - data: 在Options API中使用时的数据对象,但在此Composition API风格的代码中未直接使用(可能存在打字错误或多余信息)。
       - options: 组件的选项对象,如methods、computed等,这里也没有直接使用。
  2. 渲染内容:
       - _openBlock(): 开启一个新的渲染上下文,为即将创建的VNode设置环境。
       - _createElementBlock("div", null,...): 创建一个div元素作为容器,开始构建DOM结构。
         - 第一个子节点是一个span,内容为静态文本"静态文字"。
  3.     - 第二个 子节点是一个span 元素具有动态属性和内容:
    • id 属性绑定到 _ctx.hello
    • class 属性设置为 "bar"。
    • 文本内容绑定到 _ctx.msg,并使用 _toDisplayString 转换为字符串。
    • 第三个参数 9 /* TEXT, PROPS */, ["id"] 是一个 Vue 内部使用的标志和列表,用于优化更新过程。在这个例子中,它告诉 Vue 这个 VNode 的文本和 id 属性可能是动态的。

  4.        - 9 /* TEXT, PROPS */是一个常量,表示此VNode是一个文本节点并具有需要跟踪的属性。
           - [id]告诉Vue需要追踪id属性的变化,以便在必要时高效更新DOM。

综上所述,这段代码定义了一个Vue组件的渲染逻辑,该组件包含一个div,内有两个span元素。第一个span展示静态文本,第二个span的ID和文本内容都动态来源于组件的上下文属性,体现了Vue对于数据绑定和动态渲染的能力。


React

const profile = <div><img src="avatar.png" className="profile" /><h3>{[user.firstName, user.lastName].join(' ')}</h3>
</div>

这是一种语法糖,编译之后就会是

// 返回 vnode
const profile = React.createElement("div", null,React.createElement("img", { src: "avatar.png", className: "profile" }),React.createElement("h3", null, [user.firstName, user.lastName].join(" "))
);

这段代码使用React库来创建一个表示用户个人资料部分的DOM结构。具体解析如下:

  1. 最外层的div元素:
React.createElement("div", null, ...)


这行代码创建了一个<div>元素作为所有内容的容器。第二个参数null表示这个<div>没有额外的属性(如class或id)。第三个参数是一个数组,包含了这个<div>内的所有子元素。

  1. 头像img元素:
React.createElement("img", { src: "avatar.png", className: "profile" })


这里创建了一个<img>元素,用于显示用户的头像。它的属性包括:

    • src="avatar.png": 指定了头像图片的URL。
    • className="profile": 为这个<img>元素添加了一个CSS类名profile,可以用来通过CSS样式控制其外观。
  1. 用户名全名h3元素:
React.createElement("h3", null, [user.firstName, user.lastName].join(" "))


这行代码创建了一个<h3>标题元素,用于展示用户的全名。这里的用户名由user.firstNameuser.lastName拼接而成,中间用空格分隔(通过join(" ")实现)。假设user是一个对象,包含用户的名(firstName)和姓(lastName)。第二个参数null同样表示这个<h3>元素没有其他属性。

综合上述,整个profile变量代表了这样一个React元素结构:

<div><img src="avatar.png" class="profile" /><h3>{user.firstName} {user.lastName}</h3>
</div>

这表示一个包含用户头像和完整姓名标题的简单个人资料组件。在实际应用中,这段代码会被React用来高效地更新和管理DOM,确保视图与数据的一致性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/15365.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

堆的实现

前言&#xff1a;本文讲述堆实现的几个难点&#xff0c;注意本文主要是以实现为主&#xff0c;建议有些基本概念认识的人阅读。 目录 1.堆 2.堆的实现 堆结构的定义&#xff1a; 要实现的接口&#xff1a; 接口的实现&#xff1a; 堆的初始化和销毁&#xff1a; 向堆中插…

人工智能-YOLOv10-行人和车辆检测-yolo改进测距测速代码和原理

YOLOv10: 实时端到端目标检测技术的全新突破 YOLOv10代表了实时目标检测领域的重大进展&#xff0c;是YOLO系列模型的最新迭代&#xff0c;专为追求极致效率与精度平衡的应用场景设计。此项目由北京大学机器智能研究组&#xff08;THU-MIG&#xff09;的Ao Wang、Hui Chen、Li…

Python面试宝典:虚拟环境概念以及虚拟环境管理面试题(1000加python面试题助你轻松捕获大厂Offer)

Python面试宝典:1000加python面试题助你轻松捕获大厂Offer【第一部分:Python基础:第九章:Python虚拟环境:第一节:虚拟环境概念以及虚拟环境管理】 第九章:Python虚拟环境第一节:虚拟环境概念以及虚拟环境管理1.1、为什么需要虚拟环境?1.2、虚拟环境管理工具1.1.1. ven…

02_前端三大件HTML

文章目录 HTML用于网页结构搭建1. 标签2. 客户端服务器交互流程3. 专业词汇4. html语法细节5. 安装VSCODE安装插件6. Live Server插件使用7. 标题&段落&换行&列表8. 超链接标签使用9. 图片10. 表格的写法11. 表单标签*(重点)12. 下拉框13. 页面布局标签14. 块元素和…

浅谈JMeter工具学习基础要求和性能测试价值

浅谈JMeter工具学习基础要求和性能测试价值 JMeter工具学习基础要求 JMeter工具学习基础要求&#xff1a;   在深入学习JMeter之前&#xff0c;需要具备一定的计算机网络基础知识、编程基础&#xff0c;理解HTTP协议、TCP/IP协议栈等底层通信原理&#xff0c;这样才能更好地…

RT-Thread Env开发探索——以HC-SR04超声波传感器为例

RT-Thread Env开发探索——以HC-SR04超声波传感器为例 0.前言一、BSP优化1.修改芯片功能配置2.修改RTT配置菜单 二、软件包加载1.外设配置2.驱动框架配置3.软件包配置 三、编译及运行四、源码分析五、总结 参考文章&#xff1a;RT Thread Env CLion环境搭建 0.前言 对比使用R…

mac下安装airflow

背景&#xff1a;因为用的是Mac的M芯片的电脑&#xff0c;安装很多东西都经常报错&#xff0c;最近在研究怎么把大数据集群上的crontab下的任务都配置到一个可视化工具中&#xff0c;发现airflow好像是个不错的选择&#xff0c;然后就研究怎么先安装使用起来&#xff0c;后面再…

部署LAMP平台

目录 一、LAMP简介与概述 1.1 各组件作用 1.2 LAMP平台搭建时各组件安装顺序 1.3 httpd服务的目录结构 1.4 httpd.conf配置文件 二、编译安装Apache httpd服务 2.1 关闭防火墙&#xff0c;将安装Apache所需软件包传到/opt目录下 2.2 安装环境依赖包 ​2.3 配置软件模块…

基于RK3588的AI边缘计算网关设计

随着物联网和人工智能技术的飞速发展&#xff0c;边缘计算逐渐成为数据处理和分析的重要趋势。RK3588作为一款高性能的处理器&#xff0c;具备强大的计算能力和丰富的接口&#xff0c;为构建AI边缘计算网关提供了有力的支持。本文将介绍基于RK3588的AI边缘计算网关设计&#xf…

【Redis】 关于 Redis 哈希类型

文章目录 &#x1f343;前言&#x1f38b;命令介绍&#x1f6a9;hset&#x1f6a9;hget&#x1f6a9;hexists&#x1f6a9;hdel&#x1f6a9;hkeys&#x1f6a9;hvals&#x1f6a9;hgetall&#x1f6a9;hmget&#x1f6a9;hlen&#x1f6a9;hsetnx&#x1f6a9;hincrby&#x1…

CentOS防火墙管理及配置

CentOS防火墙管理及配置 防火墙配置介绍防火墙服务管理防火墙配置重载防火墙端口查看 防火墙配置介绍 firewalld为防火墙服务名称&#xff0c;centos7以前是使用iptables firewall-cmd&#xff1a;防火墙配置命令行工具 /etc/firewalld/&#xff1a;防火墙相关配置文件目录 防火…

分析工具:Accessibility Insights、spy、Inspect

1、Accessibility Insights 官网&#xff1a;https://accessibilityinsights.io/ 文档&#xff1a;https://accessibilityinsights.io/docs/web/overview/ Github&#xff1a;https://github.com/microsoft/accessibility-insights-windows Windows 官方推荐的辅助工具。用来查…

弹性盒子布局,flex布局

弹性盒子布局&#xff08;Flexbox&#xff09;是CSS3引入的一种新的布局模式&#xff0c;它提供了一种更加有效的方式来设计、布局和对齐容器中的项目&#xff0c;即使容器的大小动态改变或者项目的数量未知。 弹性盒子布局的主要特点是能够轻松地在不同的屏幕大小和设备上实现…

算法随想录第十三天打卡|239. 滑动窗口最大值,347.前 K 个高频元素

239. 滑动窗口最大值 &#xff08;一刷至少需要理解思路&#xff09; 之前讲的都是栈的应用&#xff0c;这次该是队列的应用了。 本题算比较有难度的&#xff0c;需要自己去构造单调队列&#xff0c;建议先看视频来理解。 题目链接/文章讲解/视频讲解&#xff1a;代码随想录 c…

使用VCPKG编译并使用Qt5

一、背景 Qt就不介绍了。VCPKG可以看这里VCPKG资料记录_vcpkg boost 多久-CSDN博客 为什么搞Qt5而不是Qt6&#xff1f;因为Qt5比较稳定吧。而且我公司也是用的Qt5。 为什么要自己编译而不是去下载Qt5&#xff1f; 第一&#xff0c;因为Qt5在Qt在线安装版本只提供到Qt5.15.2&…

【CTF Web】CTFShow web3 Writeup(SQL注入+PHP+UNION注入)

web3 1 管理员被狠狠的教育了&#xff0c;所以决定好好修复一番。这次没问题了。 解法 注意到&#xff1a; <!-- flag in id 1000 -->但是拦截很多种字符。 if(preg_match("/or|\-|\\|\*|\<|\>|\!|x|hex|\/i",$id)){die("id error"); }使用…

Linux驱动设备导论(1)

最近本人在学习Linux驱动&#xff0c;本系列教程是本人在一边学习&#xff0c;一边总结的系列教程&#xff0c;希望能够给很多刚学驱动小伙伴一些总结。 1.Linux设备分类 驱动针对的对象是存储器和外设&#xff0c;不是针对CPU&#xff0c;可以分为以下三大类&#xff1a; 1.…

『Stable Diffusion 』AI绘画,不会写提示词怎么办?

提示词 有没有想过&#xff0c;为什么你用 SD 生成的猫是长这样的。 而其他人可以生成这样的猫。 虽然生成的都是猫&#xff0c;但猫与猫之间还是有差距的。 如果你的提示词只是“cat”&#xff0c;那大概率就会出现本文第一张图的那个效果。而如果你加上一些形容词&#xff…

C#应用的用户配置窗体方案 - 开源研究系列文章

这次继续整理以前的代码。本着软件模块化的原理&#xff0c;这次笔者对软件中的用户配置窗体进行剥离出来&#xff0c;单独的放在一个Dll类库里进行操作&#xff0c;这样在其它应用程序里也能够快速的复用该类库&#xff0c;达到了快速开发软件的效果。 笔者其它模块化应用的例…