使用js对象简单模拟虚拟dom的渲染

vnode0数据:

var vnode0 = {tag: 'ul',props: {id :'ul1',style: {color: 'red', fontSize: '14px'},'data-index': 0,},on: {click:()=>console.log('click ul')},children: [{tag: 'li',children: 'a'},{tag: 'li',props: {className: 'list-item'},on: {click(e) {// e.stopPropagation();console.log('click li')}},children: [{tag: 'a',children: '好好学习'}]},]
}

一. 用js模拟dom结构:

1. 核心方法: document.createElement + document.createDocumentFragment(推荐):

let timer2 = new Date().getTime()
const vDom = document.createDocumentFragment() 
function render2(vnode) {const dom = document.createElement(vnode.tag)const props = _.get(vnode, 'props')if(!_.isEmpty(props)) {for(let key in props) {const item = _.get(props, [key]);if(key === 'className') {dom.class = item}else {dom.setAttribute(key, item)}}}if(_.get(vnode, 'props.style')) {const styleObj = vnode.props.stylelet styleStr = ''for(let key in styleObj) {const item = styleObj[key]styleStr+= `${key.replace(/[A-Z]/g, str=>'-'+str.toLowerCase())}:${item};`}dom.style = styleStr}if(_.get(vnode, 'on')) {for(let key in vnode.on) {const item = vnode.on[key]dom[`on${key}`]=item}}const children = _.get(vnode, 'children');if(typeof children === 'string') {dom.innerText = children}if(Array.isArray(children) && !_.isEmpty(children)) {for(let item of children) {const dom0 = render2(item);dom.appendChild(dom0)}}vDom.appendChild(dom)console.log('render2时间', new Date().getTime()-timer2)return dom
}render2(vnode0)
document.getElementById('box').appendChild(vDom)

2. 使用innerHTML

注意事项:

1) 不适合需要在html字符串上加onclick等事件的情况, 要加等到页面渲染完成再需要找到那些dom元素自行添加

2) 适合那些直接把click事件加到父元素上的(比如box.addEventListener('click', e=>{...}), 通过冒泡获取子元素的属性key和属性值, 进行判断处理业务

3) 数据量大的时候比较消耗性能

let timer1 = new Date().getTime()
let str = '';
function render(vnode) {str += `<${vnode.tag}`;if (_.get(vnode, 'props.id')) {str += ` id="${vnode.props.id}"`}if (_.get(vnode, 'props.className')) {str += ` class="${vnode.props.className}"`}if (_.get(vnode, 'props.style')) {const styleObj = vnode.props.stylelet styleStr = ''for (let key in styleObj) {const item = styleObj[key]styleStr += `${key.replace(/[A-Z]/g, str => '-' + str.toLowerCase())}:${item};`}str += ` style="${styleStr}"`}if (_.get(vnode, 'on')) {for (let key in vnode.on) {const item = vnode.on[key]// onclick事件不能添加...}}const children = vnode.children;if (typeof children === 'string') {str += `>${children}`}if (Array.isArray(children) && !_.isEmpty(children)) {str += '>'children.forEach(element => {render(element)});}str += `</${vnode.tag}>`;console.log('render时间', new Date().getTime() - timer1)return str
}render(vnode0);
document.getElementById('box').innerHTML = str;

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

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

相关文章

深度学习电脑配置

目录 深度学习电脑选型你真的需要这么一块阵列卡深度学习电脑选型 常见的深度学习框架:百度的飞桨框架、Google 的TensorFlow,伯克利亚学院的Caffe,蒙特利尔大学Theano(和TensorFlow非常相似),微软开发的CNTK,Facebook开发的PyTorch。 硬件怎么选? CPU: 英特尔至强银…

【linux下centos7.9安装docker,docker-composed(root用户)】

一 安装docker 1.联网下载安装docker curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun 2.安装成功 docker -v 3.将docker注册为service&#xff0c;进入/etc/systemd/system/目录,并创建docker.service文件&#xff08;注意insecure-registry修改成自己的…

2.MySQL表的操作

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 表的操作 (1)表的创建 CREATE TABLE table_name ( field1 datatype, field2 datatype, field3 datatype ) character set 字符集 collate 校验规则 engine 存储引擎; 存储引擎的不同会导致创建表的文件不同。 换个引擎。 t…

xcode打包macos报错:FlutterInputs.xcfilelist 和 FlutterOutputs.xcfilelist

xcode 打包macos的时候&#xff0c;报错如下&#xff1a; Unable to load contents of the file list: ‘macos/ephemeral/FlutterInputs.xcfilelist’ ‘macos/ephemeral/FlutterOutputs.xcfilelist’ 解决方案&#xff1a; 我的项目macos下没有找到FlutterInputs.xcfilelis…

angular项目指定端口,实现局域网内ip访问

直接修改package.json文件 "dev": "ng serve --host 0.0.0.0 --port 8080"终端运行npm run dev启动项目。 这里就指定了使用8080端口运行项目&#xff0c;同时局域网内的其他电脑可以通过访问运行项目主机的ip来访问项目 例如项目运行在ip地址为192.168.2…

jmeter压测

jmeter强大到很强大 hh~也要压测go的一些东西&#xff0c;这是三年前做的东西了&#xff0c;jmeter不支持grpc调用所以写了一个spring小服务中间层&#xff1a; 具体的jmeter开始了 这里设置线程相关 <h3>调用哪个服务的哪个方法</h3> <h3>BeanShell PrePro…

喜报 | 擎创科技实力亮相2023科创会并荣获科技创新奖

近日&#xff0c;由国家互联网数据中心产业技术创新战略联盟&#xff08;NIISA&#xff09;主办的“2023第二届国际互联网产业科技创新大会暨互联网创新产品展览会”于北京圆满落幕。 擎创科技副总裁冯陈湧受邀出席本次论坛&#xff0c;并发表了“银行分布式核心智能运维体系思…

Unity3D 基础——使用 Mathf.SmoothDamp 函数制作相机的缓冲跟踪效果

使用 Mathf.SmoothDamp 函数制作相机的缓冲跟踪效果&#xff0c;让物体的移动不是那么僵硬&#xff0c;而是做减速的缓冲效果。将以下的脚本绑定在相机上&#xff0c;然后设定好 target 目标对象&#xff0c;即可看到相机的缓动效果。通过设定 smoothTime 的值&#xff0c;可以…

洗地机什么牌子好用?洗地机排名

洗地机是如今清洁工作中非常重要的设备&#xff0c;它可以提高清洁效率&#xff0c;保持地面卫生&#xff0c;并减轻人力劳动的负担&#xff0c;市面上有许多不同品牌的洗地机&#xff0c;那么洗地机哪个牌子最好用呢?下面我们来介绍一下洗地机排名&#xff0c;并分析其热门型…

DIY私人图床:使用CFimagehost源码自建无需数据库支持的PHP图片托管服务

文章目录 1.前言2. CFImagehost网站搭建2.1 CFImagehost下载和安装2.2 CFImagehost网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1 Cpolar临时数据隧道3.2 Cpolar稳定隧道&#xff08;云端设置&#xff09;3.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 4.公网访问测…

点云处理【三】(点云降采样)

点云降采样 第一章 点云数据采集 第二章 点云滤波 第二章 点云降采样 1. 为什么要降采样&#xff1f; 我们获得的数据量大&#xff0c;特别是几十万个以上的点云&#xff0c;里面有很多冗余数据&#xff0c;会导致处理起来比较耗时。 降采样是一种有效的减少数据、缩减计算量…

【LeetCode刷题(数据结构)】:翻转二叉树

方法一&#xff1a;递归 思路与算法 这是一道很经典的二叉树问题。显然&#xff0c;我们从根节点开始&#xff0c;递归地对树进行遍历&#xff0c;并从叶子节点先开始翻转。如果当前遍历到的节点 root\textit{root}root 的左右两棵子树都已经翻转&#xff0c;那么我们只需要交…

如何在C程序中使用libcurl库下载网页内容

概述 爬虫是一种自动获取网页内容的程序&#xff0c;它可以用于数据采集、信息分析、网站监测等多种场景。在C语言中&#xff0c;有一个非常强大和灵活的库可以用于实现爬虫功能&#xff0c;那就是libcurl。libcurl是一个支持多种协议和平台的网络传输库&#xff0c;它提供了一…

天锐绿盾透明加密、半透明加密、智能加密这三种不同加密模式的区别和适用场景——@德人合科技-公司内部核心文件数据、资料防止外泄系统

由于企事业单位海量的内部数据存储情况复杂&#xff0c;且不同公司、不同部门对于文件加密的需求各不相同&#xff0c;单一的加密系统无法满足多样化的加密需求。天锐绿盾企业加密系统提供多种不同的加密模式&#xff0c;包括透明加密、半透明加密和智能加密&#xff0c;用户可…

解码自然语言处理之 Transformers

自 2017 年推出以来&#xff0c;Transformer 已成为机器学习领域的一支重要力量&#xff0c;彻底改变了翻译和自动完成服务的功能。 最近&#xff0c;随着 OpenAI 的 ChatGPT、GPT-4 和 Meta 的 LLama 等大型语言模型的出现&#xff0c;Transformer 的受欢迎程度进一步飙升。这…

Burstormer论文阅读笔记

这是CVPR2023的一篇连拍图像修复和增强的论文&#xff0c;一作是阿联酋的默罕默德 本 扎耶得人工智能大学&#xff0c;二作是旷视科技。这些作者和CVPR2022的一篇BIPNet&#xff0c;同样是做连拍图像修复和增强的&#xff0c;是同一批。也就是说同一个方向&#xff0c;22年中了…

“传统”开发与AI开发的区别与联系

1、传统开发的算法和软件整体&#xff0c;也可以看成是一个“大模型”&#xff0c;其中有不同层次的处理&#xff0c;最终能够完成从输入到输出的计算&#xff0c;不过&#xff0c;其中的计算都是人工定义的&#xff0c;一般依赖于研究成果的应用。研究成果在实际中的应用处理。…

设计模式:简单工厂模式(C#、JAVA、JavaScript、C++、Python、Go、PHP):

简介&#xff1a; 简单工厂模式&#xff0c;它提供了一个用于创建对象的接口&#xff0c;但具体创建的对象类型可以在运行时决定。这种模式通常用于创建具有共同接口的对象&#xff0c;并且可以根据客户端代码中的参数或配置来选择要创建的具体对象类型。 在简单工厂模式中&am…

MySQL --- 聚合查询

聚合查询相当是行和行之间进行运算。 下文中的所有示例操作都是基于此表&#xff1a; 聚合函数 count(列名) select count(列名) from 表名; 统计该表中该列的行数&#xff0c;但是 null 值不会统计在内&#xff0c;但是如果写为 count(*) null 也会算进去&#xff08;就算…