- Published on
React-useMemo 分析
- Authors
- Name
- LIZHI
概要
作用:在组件的顶层调用useMemo 来缓存每次重新渲染都需要及计算的结果
用法: useMemo(calculateValue, dependencies)
实例:
import useMemo from 'react';
const renderNodes = useMemo(() => {
return nodes.map((item: any, index: number) => {
return (
<div className={styles['list-new']} key={index}>
{item && item.finish != 2 && < $chatItem {...item} />}
{item && item.finish == 2 && < $tips {...item} />}
</div>
);
});
}, [newIdx, showDot, nodes]);
需要给 useMemo 传递两样东西
- 一个没有任何参数的 calculation 函数,像这样 () =>,并且返回任何你想要的计算结果。
- 一个由包含在你的组件中并在 calculation 中使用的所有值组成的 依赖列表。
在初次渲染时,你从 useMemo 得到的 值 将会是你的 calculation 函数执行的结果。
在随后的每一次渲染中,React 将会比较前后两次渲染中的 所有依赖项 是否相同。如果通过 Object.is 比较所有依赖项都没有发生变化,那么 useMemo 将会返回之前已经计算过的那个值。否则,React 将会重新执行 calculation 函数并且返回一个新的值。
换言之,useMemo 在多次重新渲染中缓存了 calculation 函数计算的结果直到依赖项的值发生变化。
如果计算速度很快,这将不会产生问题。但是,当正在过滤转换一个大型数组,或者进行一些昂贵的计算,而数据没有改变,那么可能希望跳过这些重复计算。如果 todos 与 tab 都与上次渲染时相同,那么像之前那样将计算函数包装在 useMemo 中,便可以重用已经计算过的 visibleTodos。
这种缓存行为叫做 记忆化。
注意
你应该仅仅把 useMemo 作为性能优化的手段。如果没有它,你的代码就不能正常工作,那么请先找到潜在的问题并修复它。然后再添加 useMemo 以提高性能。