React.memo 、 useMemo 、 useCallback 对比
#react
目录
1. 总结
- React.memo 是一个==高阶组件(HOC)==,用于==组件级别的缓存==
- 可接受第二个参数:自定义比较函数
- useMemo 用于==缓存==计算结果
- useCallback 用于缓存 函数
2. React.useCallback 和 useCallback
实际上它们是完全一样的!这只是引用方式的不同:
// 方式 1:从 React 对象中解构
import { useCallback } from 'react';
const memoizedFn = useCallback(() => {}, []);
// 方式 2:通过 React 对象调用
import React from 'react';
const memoizedFn = React.useCallback(() => {}, []);
两种方式功能完全相同,都是用来缓存函数的 Hook。选择哪种方式主要取决于你的代码风格和项目约定。
3. React.memo 和 useMemo 的区别
3.1. React.memo
React.memo 是一个高阶组件(HOC),用于组件级别的缓存:
// React.memo 示例
const MyComponent = React.memo(function MyComponent(props) {
/* 渲染逻辑 */
return (
<div>
<h1>{props.name}</h1>
<p>{props.description}</p>
</div>
);
});
// 可以添加第二个参数:可以添加自定义比较函数
const MyComponent = React.memo(function MyComponent(props) {
/* 渲染逻辑 */
}, (prevProps, nextProps) => {
// 返回 true 则不重新渲染,返回 false 则重新渲染
return prevProps.name === nextProps.name;
});
3.1.1. 主要特点
- 用于优化函数组件的重渲染
- 对比 props 变化,决定是否重新渲染组件
- 是一个高阶组件,包裹整个组件
- 适用于纯展示型组件的优化
3.2. useMemo
useMemo 是一个 Hook,用于缓存计算结果:
// useMemo 示例
function MyComponent() {
const [count, setCount] = useState(0);
const [text, setText] = useState('');
// 缓存计算结果
const expensiveValue = useMemo(() => {
return computeExpensiveValue(count);
}, [count]);
// 缓存对象
const memoizedObject = useMemo(() => ({
id: count,
text: text
}), [count, text]);
return (
<div>
<p>Computed value: {expensiveValue}</p>
<ChildComponent data={memoizedObject} />
</div>
);
}
主要特点:
- 用于缓存计算结果或值
- 只在依赖项改变时重新计算
- 是一个 Hook,在组件内部使用
- 适用于昂贵的计算或防止对象引用变化
3.3. 总结
- React.memo 适用于减少组件重渲染
- useMemo 适用于缓存计算结果或对象引用
- 不要过度优化,只在性能问题明显时使用
- 配合 React DevTools 进行性能分析