在 React 中,useMemo
和 memo
都用于 优化性能,减少不必要的渲染,但它们的使用场景不同。
useMemo
(记忆化计算)useCallback
结合使用)import React, { useState, useMemo } from "react";
const ExpensiveCalculation = ({ num }: { num: number }) => {
const result = useMemo(() => {
console.log("计算中...");
return num * 2; // 假设这是一个昂贵的计算
}, [num]);
return 计算结果: {result}
;
};
export default function App() {
const [count, setCount] = useState(0);
const [num, setNum] = useState(5);
return (
count: {count}
);
}
useMemo
缓存计算结果,当 num
变化时才重新计算count
按钮时,num
没变,因此不会重新计算memo
(组件缓存)import React, { useState, memo } from "react";
const Child = memo(({ name }: { name: string }) => {
console.log("子组件渲染...");
return 子组件: {name}
;
});
export default function App() {
const [count, setCount] = useState(0);
const [name, setName] = useState("React");
return (
count: {count}
);
}
Child
组件使用 memo
进行缓存count
按钮时,name
没变,所以 Child
不会重新渲染name
按钮时,Child
才会重新渲染useMemo
vs memo
的区别useMemo
作用: 记忆化 计算值
优化点: 避免重复计算
依赖项: useMemo(fn, [deps])
适用场景: 计算量大的数据处理
返回值: 计算结果
memo
作用: 记忆化 组件
优化点: 避免组件不必要的渲染
依赖项: 组件的 props
适用场景: 组件的性能优化
返回值: 缓存组件
useMemo
和 memo
结合使用可以 同时使用 useMemo
和 memo
来优化 React 组件。
示例
import React, { useState, useMemo, memo } from "react";
const Child = memo(({ num }: { num: number }) => {
const result = useMemo(() => {
console.log("计算 num * 2...");
return num * 2;
}, [num]);
console.log("子组件渲染...");
return 计算结果: {result}
;
});
export default function App() {
const [count, setCount] = useState(0);
const [num, setNum] = useState(5);
return (
count: {count}
);
}
memo
防止 Child
组件无意义渲染useMemo
缓存 num * 2
的计算值count
按钮时,Child
不会重新渲染num
按钮时,Child
重新渲染并重新计算useMemo
适用于避免重复计算memo
适用于避免子组件不必要的渲染