react虚拟dom

染方式:
第一种方式: 整体替换DOM
1、 state数据
2、 JSX 模板
3、 数据 + 模板 生成真实的DOM 来显示
4、 state 发生变化
5、 数据 + 模板 生成真实的DOM, 替换原始的DOM
缺陷:
第一次生成了一个完整的DOM片段
第二次生成一个完整的DOM片段
第二次的DOM替换第一次DOM, 非常耗性能

第二种方式: 替换DOM中的差异部分
1、 state数据
2、 JSX 模板
3、 数据 + 模板 生成真实的DOM 来显示
4、 state 发生变化
5、 数据 + 模板 生成真实的DOM, 并不直接替换原始的DOM
6、 新的DOM和原始的DOM 做对比, 找差异
7、 找出 差异, 如某个input框发生了变化
8、 只用新的DOM中的input元素, 替换掉老的DOM中的input元素

缺陷:
性能的提升并不明显

第三种方式: 采用虚拟DOM
1、 state数据
2、 JSX 模板
3、 数据 + 模板 生成虚拟DOM( 虚拟DOM就是一个JS对象, 用它来描述真实的DOM)( 损耗了性能)

[‘div’, {id: ‘abc’}, [‘span’, {}, ‘hello world’]]

4、 用虚拟DOM的结构生成真实的DOM, 来显示

<div id="abc"><span>hello world</span></div>

5、 state发生变化

6、 数据 + 模板 生成新的虚拟DOM (极大的提升了性能)

[‘div’, {id: ‘abc’}, [‘span’, {}, ‘bye bye’]]

7、比较原始的虚拟DOM和新的虚拟DOM的区别,找到区别是span中的内容 (极大的提升了性能)

setState是异步的,可以将连续的数据变化合并成一次去更新

虚机DOM中的Diff算法
同层比较,先比较第一层,相同,则比较第二层;不相同则停止比较,重新渲染

简化比较算法

比对时根据key值比较,所以要给循环时的节点设key值,key不要用index,index会变化
比如:
item key
a 0
b 1
c 1
删除a
b 0
c 1
b c的key值变化了,跟之前的没有关联关系了

8、直接操作DOM,改变span中的内容

优点:
性能提升了
它使得跨端应用得以实现 React Native

render() {
         //JSX ->JS对象(虚机DOM)->真实的DOM
		return (
			<div> //此处的<div>不是真实的html元素,是JSX语法中的元素,JSX是为了简化编程方式
				item
			</div>
		)
		等价于
		//JSX ->createElement -> JS对象(虚机DOM)->真实的DOM
		return React.createElement('div',{},'item');
}
### React 虚拟 DOM 实现原理及工作流程 #### 1. 创建虚拟 DOM 树 当开发者编写 JSX 代码时,实际上是在创建 JavaScript 对象。这些对象构成了一个轻量级的、与浏览器无关的表示层——即虚拟 DOM 树。每当状态发生变化或接收到新属性时,React 组件会重新渲染并构建新的虚拟 DOM 树[^2]。 ```javascript const element = ( <h1 className="greeting"> Hello, world! </h1> ); ``` 这段代码最终会被转换成如下形式: ```javascript const element = { type: 'h1', props: { className: "greeting", children: "Hello, world!" } }; ``` #### 2. 批处理更新 (Batching Updates) 为了提升性能,React 将多次独立的状态变更合并为一次批量更新过程。这意味着即使有多个事件触发了组件重绘请求,React 也只会执行一轮完整的比较和同步操作[^1]。 #### 3. Diff 算法计算差异 一旦生成了最新的虚拟 DOM 树之后,React 使用高效的 diff 算法来识别前后两棵虚拟 DOM 树之间的差别。此过程中主要关注三个层面的变化检测:元素类型、子节点顺序以及属性值变动。通过这种方式能够精准定位到具体哪些部分发生了改变[^3]。 - **Tag 不同则视为不同节点** - **仅在同一层级内进行比较** - **利用 Key 属性作为唯一标识** 例如,在遍历兄弟节点集合时如果遇到相同的标签名加上唯一的键,则认为它们代表同一个逻辑上的 UI 单元;反之则是新增加或者删除的情况。 #### 4. 更新真实的 DOM 最后一步就是把上述找到的不同之处映射回实际存在的 HTML 文档结构之中去。由于之前已经精确锁定了需要调整的地方,因此可以直接针对那些发生过更改的位置实施针对性很强的小范围修正动作,而不是像传统做法那样大面积地重构整个页面布局。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值