网站如何加入流量统计,手机网站后期维护,python网站开发项目,南京做南京美容整形网站在 React 中#xff0c;性能优化是一个重要的主题#xff0c;特别是在复杂的组件树中。本文将演示如何在同一个父组件中使用 useMemo 和 React.memo 来优化子组件的渲染。
1. 组件结构
创建一个父组件#xff0c;包含两个子组件#xff1a;
MemoChild#xff1a;使用 R…在 React 中性能优化是一个重要的主题特别是在复杂的组件树中。本文将演示如何在同一个父组件中使用 useMemo 和 React.memo 来优化子组件的渲染。
1. 组件结构
创建一个父组件包含两个子组件
MemoChild使用 React.memo 进行优化。 ExpensiveChild使用 useMemo 缓存。
示例
import React, { useState, useMemo } from react;// 子组件使用 React.memo
const MemoChild React.memo(({ data }) {console.log(MemoChild rendered);return div{data}/div;
});// 子组件使用 useMemo 缓存
const ExpensiveChild ({ data }) {console.log(ExpensiveChild rendered);return div{data}/div;
};// 父组件
function Parent() {const [count, setCount] useState(0);const [data, setData] useState(Initial Data);// 使用 useMemo 来缓存 ExpensiveChildconst memoizedExpensiveChild useMemo(() {console.log(Calculating ExpensiveChild);return ExpensiveChild data{data} /;}, [data]);return (divh1Parent Component/h1MemoChild data{Count: ${count}} /{memoizedExpensiveChild}button onClick{() setCount(count 1)}Increment Count/buttonbutton onClick{() setData(New Data)}Update Data/button/div);
}export default Parent;2. 组件功能解析
MemoChild
使用 React.memo 包裹只有当其 data 属性变化时才会重新渲染。
ExpensiveChild
普通的子组件父组件使用 useMemo 来缓存其实例。只有当 data 属性变化时useMemo 会重新计算并返回新的组件实例。
Parent
管理两个状态count 和 data。点击“Increment Count”按钮时只有 MemoChild 会更新而 ExpensiveChild 的引用保持不变。点击“Update Data”按钮时ExpensiveChild 会重新渲染因为 data 发生了变化。
3. 运行结果
点击“Increment Count”按钮
count 状态更新MemoChild 会重新渲染控制台输出 MemoChild renderedExpensiveChild 不会重新渲染控制台不会输出。
点击“Update Data”按钮
data 状态更新ExpensiveChild 会重新渲染控制台输出 Calculating ExpensiveChild
ExpensiveChild rendered4. useMemo 和 React.memo 对比
useMemo
Hook钩子函数用于缓存计算结果。只有当依赖项变化时才会重新计算。使用useMemo 缓存 ExpensiveChild 实例避免不必要的重新渲染。
React.memo
高阶组件缓存组件的渲染结果。只有当传入的 props 发生变化时组件才会重新渲染。适用于根据 props 变化控制渲染的场景。
5. 渲染逻辑总结
基本数据类型如 number、string、boolean
当组件的 props 是基本数据类型时如果其值未发生变化React.memo 不会重新渲染组件。
引用数据类型如 object、array
当组件的 props 是引用数据类型时React.memo 会进行浅比较。如果引用相同组件不会重新渲染如果引用不同组件会重新渲染。
6. 关键点
基本数据类型的比较只要值相同组件不会重新渲染。引用数据类型的比较如果引用相同组件不会重新渲染如果引用不同无论内容是否相同组件会重新渲染。