跳到主要内容

useMemo

1.是什么

React 中"缓存计算结果"的 Hook,只有依赖变化时才重新计算。它的作用是"避免重复执行昂贵计算",常用于性能优化以及保持对象引用稳定。

本质上:useCallback 缓存函数引用useMemo 缓存函数执行结果

2.使用方法

// useMemo(fn, deps)
// 执行 fn,缓存返回值

function App() {
const [count, setCount] = useState(0);

const total = useMemo(() => {
return heavyCalc();
}, []);

return <div>{total}</div>;
}

3.高频应用场景

3.1 列表过滤

// 如果 list 很大,每次 render 都会重新 filter,使用 useMemo 优化

const filteredList = useMemo(() => {
return list.filter((item) => item.name.includes(keyword));
}, [list, keyword]);

// 此时,只有 list 变化、keyword 变化才重新计算

3.2 对象稳定

// 每次 render 都是新对象,即 {} !== {}
// 会导致 React.memo 失效,useEffect 重复执行

const user = useMemo(() => {
return { name: "Tom" };
}, []);

// 现在 user 引用稳定

3.3 避免 effect 重复执行

// options 每次都是新对象,所以 effect 每次执行

// 正确用法:
const options = useMemo(() => ({ page: 1 }), []);

useEffect(() => {
// ...
}, [options]);

4.真正适合的场景

大计算: filter、sort、markdown 解析、AI 消息处理、diff 计算

稳定对象引用: props 对象、options 配置、context value