React 获取虚拟dom节点的两种方法

本文介绍了在React中获取DOM节点值的两种不同方法。一种是通过使用`ref`属性的传统方式,并结合`findDOMNode`来获取;另一种则是采用更现代的方法,即直接在`ref`回调函数中保存对DOM节点的引用。这两种方法各有特点,在实际应用中可以根据项目需求和个人偏好选择合适的方式。

第一种常规做法:

<div className="confirm-money" ref="totalNeedPayRef">
  { totalNeedPay }
</div>

import React from 'react';
import { findDOMNode } from 'react-dom';

const { totalNeedPayRef } = this.refs;
const totalNeedPay = findDOMNode(totalNeedPayRef).innerText.replace(/,/g, '') * 1;

 

 

第二种超前做法:

<span className="price-num" ref={(ref) => this.payMoneyRef = ref}>investMoney</span>

console.log(this.payMoneyRef.innerText);

 

### React 虚拟 DOM 的工作原理及实现方式 #### 1. 虚拟 DOM 的基本概念 虚拟 DOM 是一种轻量级的 JavaScript 对,它是真实 DOM 的副本。在 React 中,所有的 DOM 更新操作首先会在虚拟 DOM 上完成,随后通过高效的 Diff 算法计算出需要更新的真实 DOM 部分并进行同步[^2]。 #### 2. 虚拟 DOM 的创建与 JSX 编译 当开发者使用 JSX 编写组件时,这些 JSX 代码会被 Babel 自动编译为 `React.createElement` 方法调用的形式。例如: ```javascript let element = ( <h1 id="test" className="testClass"> test </h1> ); ``` 上述 JSX 代码会被编译为如下形式: ```javascript let element = React.createElement( "h1", { id: "test", className: "testClass" }, "test" ); ``` 这表明,在底层实现中,JSX 只是一个语法糖,而真正的核心逻辑是由 `React.createElement` 构建虚拟 DOM 节点[^3]。 #### 3. 虚拟 DOM 的更新流程 React 使用双缓冲策略管理界面状态的变化。每当组件的状态或属性发生变化时,React 会重新构建整个组件树对应的虚拟 DOM,并将其与之前的虚拟 DOM 进行对比(即 Diff 算法)。Diff 算法的主要目标是以最有效的方式找到两棵虚拟 DOM 树之间的差异[^1]。 以下是虚拟 DOM 更新的核心步骤: - **重建虚拟 DOM**:基于最新的数据结构生成新的虚拟 DOM。 - **执行 Diff 算法**:比较新旧两个虚拟 DOM 树,找出它们之间存在的差异。 - **更新真实 DOM**:仅针对有变化的部分对真实 DOM 进行最小化的修改,从而减少不必要的重绘和回流操作[^5]。 #### 4. 性能优化的关键点 尽管虚拟 DOM 提供了显著的性能优势,但在某些情况下仍需注意潜在的性能瓶颈。为了进一步提升应用效率,可以采取以下措施: - 减少无意义的重新渲染次数,合理使用 `shouldComponentUpdate` 或函数式组件中的 `React.memo` 来控制子组件的更新行为。 - 利用 Immutable 数据结构避免深层对比较带来的额外开销。 - 合理拆分子组件,使每次更新影响范围尽可能缩小。 --- ### 示例代码展示虚拟 DOM 创建过程 下面展示了如何手动模拟简单的虚拟 DOM 和其更新机制: ```javascript // 手动定义一个简易版的虚拟 DOM 结构 function createVNode(type, props, children) { return { type, props, children }; } // 初始化虚拟 DOM const vdomOld = createVNode("div", {}, [ createVNode("span", {}, ["Hello"]), ]); // 新的虚拟 DOM const vdomNew = createVNode("div", {}, [ createVNode("span", {}, ["World"]), ]); // 模拟 Diff 算法 function simpleDiff(vdomOld, vdomNew) { if (vdomOld.type !== vdomNew.type || vdomOld.props !== vdomNew.props) { console.log("Detected changes in node structure or attributes."); } if (JSON.stringify(vdomOld.children) !== JSON.stringify(vdomNew.children)) { console.log("Children have changed."); } } simpleDiff(vdomOld, vdomNew); // 输出检测到的内容变更信息 ``` 此示例简化了真实的虚拟 DOM 差异检测逻辑,但足以说明其实现思路。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值