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

JSX底层渲染机制

JSX底层渲染机制

一,.步骤

1.把我们写的jsx语法编译为虚拟DOM【virtualDOM】
虚拟DOM对象:框架自己内部构建的一套对象体系(对象的相关成员都是React内部绑定的),基于这些属性描述出我们所构建视图中的DOM接的相关特征

@1基于babel-preset-react-app 把jsx编译为React.createElement(…)的格式。

只要是元素节点,必然会基于createElement进行处理!
React.createElement(ele,props,…children)
+ele: 元素标签名【或组件】
+props: 元素的属性集合(对象),如果没有任何的属性,则此值为null
+children: 第三个及其以后得参数,都是当前元素的子节点

如下图jsx

root.render{<><h2 className='title' style={styleObj}>XXXX</h2><div className='box'><span>x</span><span>y</span></div></>
}

编译为
在这里插入图片描述
@再把CreateElement的方法执行,创建出VirtualDom对象【也有称为:JSX元素、JSX对象、ReactChild对象…】

//虚拟DOM对象
virtualDOM={$$typeOf:Symbol(react.element),ref:null,key:null,type:标签名【或组件】,//存储了元素相关属性&子节点信息props:{元素的相关节点children:子节点信息【没有子节点就没有则个属性、属性可能是一个值,也可能是一个数组】}
}
/*createElement:创建虚拟DOM对象*/
export fucnction createElement(ele,props,...children){let virtualDOM={$$typeOf:Symbol('react.element'),key:null,key:null,ref:null,type:null. props:{}};let len=children,lengthvirtualDOM.type=ele;if(props){virtualDOM.props={...props}}if(len===1){virtualDOM.props.children=children[0]}else if(len>1){virtualDOM.props.children=children}return virtualDOM
}

2.构建的virtualDOM渲染为真实的DOM元素
真实DOM:浏览器页面中,最后渲染出来,让用户看见的DOM元素
基于ReactDOM中的render方法处理
v16

ReactDOM.render(<>...</>domcument.getElementById('root')
)

v18

const root = React.createRoot(dociment.getElementById('root'))
root,render(<>...</>
)

补充:第一次渲染页面是直接从虚拟DOM —> 真实ODM,但是后续视图更新的时候会经过一个DOM-DIFF的对比,计算出补丁包PATCH(两次视图差异部分),把PATCH补丁包进行渲染

/*render:把虚拟DOM变为真实DOM*/
export function render(virtualDOM,container){let {type,props}=virtualDOM;if(typeof type==='string'){//存储的是标签名:动态创建这样一个标签let ele=domcument.createElement(type);//为标签设置相关属性&节点each(props,(value,key)=>{//classNmae的处理if(key==='className'){ele.className=valuereturn}//style的处理:value存储的是样式对象if(key==='style'){each(value,(val,attr)=>{ele.style[attr]=val})return}//子节点的处理:value存储的children属性值if(key==='children'){let children = valueif(children.length===1){children=[children]}children.forEach(child=>{//子节点是文本节点:直接插入if(typeof child==='string'){ele.appendChild(domcument.createTextNode(child))return;	}//子节点又是一个虚拟ODM:递归处理render(child,ele)})return}ele.setAttribute(key,value);})container.appendChild(ele)}
}
http://www.lryc.cn/news/149918.html

相关文章:

  • 2023_Spark_实验六:Scala面向对象部分演示(二)(IDEA开发)
  • ArcGIS美化科研论文地图(利用在线底图)
  • vue项目静态文件资源下载
  • Apache Hudi初探(三)(与flink的结合)--flink写hudi的操作(真正的写数据)
  • 解释 Git 的基本概念和使用方式(InsCode AI 创作助手)
  • 【QT】信号和槽(15)
  • EFLK日志平台(filebeat-->kafka-->logstash-->es-->kiabana)
  • C盘扩容遇到的问题(BitLocker解密、)
  • ShardingSphere——柔性事务SEATA原理
  • Introducing GlobalPlatform(一篇了解GP)
  • Ubuntu 18.04上无法播放MP4格式视频解决办法
  • 科技驱动产业升级:浅谈制造型企业对MES系统的应用
  • 智能化新十年,“全栈智能”定义行业“Copilot智能助手”
  • Docker资源控制cgroups
  • 通过python 获取当前局域网内存在的IP和MAC
  • 解决D盘的类型不是基本,而是动态的问题
  • 如何判断自己的qt版本呢?
  • 【文心一言大模型插件制作初体验】制作面试错题本大模型插件
  • ROS 2官方文档(基于humble版本)学习笔记(二)
  • excel中公式结合实际的数据提取出公式计算的分支
  • 3D模型优化实战:LowPoly、纹理烘焙及格式转换
  • genome comparison commend 2 MCMCtree
  • Linux安装JenkinsCLI
  • Midjourney学习(一)prompt的基础
  • 12 权重衰退
  • 简化测试流程,提供卓越服务:TestComplete+Salesforce满足不断发展的企业的需求
  • kafka 命令脚本说明以及在java中使用
  • Qt应用开发(基础篇)——文件选择对话框 QFileDialog
  • 图像OCR转文字,验证码识别技术太疯狂-UI软件自动化
  • Docker:自定义镜像