引言
自己做项目demo 的时候,基本上就是能跑就行,现在接触真实上线项目后,发现很多东西并不是代码实现就好,还需要考虑性能优化。
随着应用规模的增大,组件的重新渲染可能会成为性能瓶颈。下面学习一个新的 React Hook - UseMemo!React 提供的 useMemo 这个 Hook,可以帮助我们优化组件的性能,避免不必要的计算和重复渲染。
语法定义
useMemo 基本语法如下:
const memoizedValue = useMemo(() => {
// ... code
return calculatedValue;
}, [dependencies]);
我们需要给 useMemo 传递两样东西:
- 计算函数:一个没有任何参数的函数,返回值为想要缓存的计算结果。
- 依赖列表:一个数组,包含在计算函数中使用的所有变量。只有当这些依赖项发生变化时,
useMemo才会重新计算值。
简单来说,useMemo 就是帮我们记住某个计算结果,只有当依赖项变了,它才会重新算一遍。
使用效果
useMemo 的主要作用是缓存计算结果,避免在每次渲染时都进行重复计算。它的使用效果可以总结为以下几点:
- 减少不必要的计算:当依赖项没有变化时,
useMemo会直接返回缓存的值,而不执行计算函数。 - 优化子组件渲染:将
useMemo的计算结果作为 props 传递给子组件时,可以避免子组件不必要的重新渲染,尤其是在子组件使用了React.memo进行优化的情况下。 - 依赖项管理:
useMemo的计算结果可以作为其他 Hook 的依赖项,确保这些 Hook 只在必要时执行。
扩展场景
useMemo 的使用场景并不局限于简单的计算缓存。以下是一些常见的扩展场景:
1. 复杂计算优化
当组件中有一些复杂的计算逻辑,且这些计算的依赖项变化不频繁时,使用 useMemo 可以显著提升性能。
const expensiveCalculation = useMemo(() => {
let result = 0;
for (let i = 0; i < 1000000; i++) {
result += i;
}
return result;
}, [dependency]);
2. 避免子组件不必要的渲染
当父组件重新渲染时,如果子组件的 props 没有变化,使用 useMemo 可以避免子组件不必要的渲染
const memoizedData = useMemo(() => {
return { data: someData };
}, [someData]);
return <ChildComponent data={memoizedData} />;
3. 作为其他 Hook 的依赖项
useMemo 的计算结果可以作为其他 Hook 的依赖项,确保这些 Hook 只在必要时执行。
const memoizedValue = useMemo(() => {
return calculateValue(dependency);
}, [dependency]);
useEffect(() => {
// 仅在 memoizedValue 变化时执行
doSomething(memoizedValue);
}, [memoizedValue]);
参考例子
以下是一个来自 React 官网的示例,展示了如何使用 useMemo 来优化一个计算过滤列表的组件:zh-hans.react.dev/reference/r…
(官网有直观的组件可以现场切换tab感受使用usememo的区别,但是实际上好像并没有什么区别,也有可能是数据量不够大?)
总结
useMemo 是 React 中一个强大的工具,能够帮助我们在组件渲染过程中优化性能。通过缓存计算结果,useMemo 可以减少不必要的计算和渲染,提升应用的响应速度。