react 虚拟 dom

虚拟 dom本质上就是 在 js 和 真实 dom 之间加了一个缓存,利用 diff 算法,避免了没有必要的 dom 操作,提高性能。

虚拟 dom 并不一定会提高性能: 

        1 :在首次渲染的时候,因为要创建一层额外的 虚拟 dom 也就是 js 对象,肯定不如直接操作 dom 会增加开销

        2: 在视图复杂的情况下, 会提升渲染性能, 有频繁操作 dom 的话, 虚拟dom在更新真实 dom 之前会通过 diff 算法对比 新旧两个 dom 树的差异,然后在吧最终的差异表现到 真实 dom 上,不会每次直接操作 真实 dom 。另外可以给节点设置 key ,让节点重用避免大量的重绘节省性能。

react 中 key 的作用: 

        在 diff 算法中 判断元素是最新创建的还是 移动来的。从而减少不必要的 diff 提高diff 同级比较的效率。避免原地复用带来的副作用。key 使用来追踪 列表元素被修改 增加删除的唯一标识。必须要保证 key 的唯一性。

### 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、付费专栏及课程。

余额充值