如何通过 useMemo 和 useCallback 提升你的 React 应用性能

背景

在 React 中,useMemo 和 useCallback 这两个 hook 是我们优化应用性能的有力工具。它们会返回 memoized 版本的值或函数,只在依赖项发生变化时才进行重新计算或定义。

Hook 介绍

useMemo

useMemo 的作用是返回一个 memoized 值,它接受两个参数:一个函数和一个依赖数组。只有当依赖项中的一个值变化,才会重新计算并返回新的 memoized 值。

javascript 复制代码
const memoizedValue = useMemo(
  () => computeExpensiveValue(a, b),
  [a, b],
);

上述代码例子中,useMemo 返回了一个 memoized 版本的 computeExpensiveValue(a, b) 函数结果,a 或 b 改变时,才会重新计算。

举个例子

假设 computeExpensiveValue 是一个需要大量计算资源的函数,比如它需要计算斐波那契数列的第 n 项。在这种情况下,每次组件渲染时重新计算显然是一种资源浪费。通过使用 useMemo ,我们可以在 a 或者 b 变化时,才重新进行这种耗时的计算。

useCallback

useCallback 与 useMemo 用法类似,不过它返回的是一个 memoized 函数。这在我们需要将函数作为 prop 传递给子组件时非常有用,避免由于父组件重渲染导致不必要的函数重新创建。

javascript 复制代码
const memoizedCallback = useCallback(
  () => {
    doSomething(a, b);
  },
  [a, b],
);

在此代码例子中,useCallback 返回的是一个 memoized 版本的函数 () => doSomething(a, b),只有当 a 或 b 发生变化时,才会重新创建新的函数定义。

举个例子

假设我们在一个父组件中定义了一个事件处理器,这个处理器依赖于父组件的一些 prop。如果我们每次在渲染父组件时都创建新的事件处理器,那么即使 prop 没有变化,子组件还是会进行不必要的重渲染。

为了解决这个问题,我们可以使用 useCallback 来 memoize 事件处理器,只有当依赖的 prop 变化时,才重新创建事件处理器。

建议

虽然 useMemo 和 useCallback 都可用于提升性能,但我们需要谨慎选择使用场景。过度使用可能导致更多的计算开销。例如在计算新的函数或值的过程本身不需要很多计算资源,但由于频繁的依赖项检查和新值的计算,可能会导致性能反而下降。

总结

useMemo 和 useCallback 是 React 提供的强有力的性能优化工具。掌握正确的使用场景和方式,可以有效地提升你的应用性能,而避免不必要的计算开销。

相关推荐
我喜欢就喜欢8 分钟前
Chrome 插件开发实战指南
前端·chrome
夕阳_醉了11 分钟前
花了一天的时间,地板式扫盲了vue3所有API盲点
前端·javascript·vue.js
LinDaiuuj21 分钟前
Figma Specs 高效交付与开发协作指南
前端·figma
风骏时光牛马33 分钟前
大模型底层架构与推理机制源码深度剖析
前端
多客:duokelijie35 分钟前
婚恋交友小程序合规梳理:上线运营需要准备哪些资质与许可手续?
后端·mysql·微信小程序·前端框架·uni-app·php·持续部署
java1234_小锋6 小时前
【技术专题】HTML5 网页技术 - HTML5 Canvas 基础以及动画入门
前端·html·html5
知了学历孙老师9 小时前
小自考的校考和统考,出题方和难度差在哪
java·大数据·前端
ShineWinsu11 小时前
对于JavaScript:操作元素的解析
开发语言·前端·javascript·面试·web·dom·元素
福兮说11 小时前
JSON 格式正确,数据就可靠吗?我用一份自编配置检查类型与空值
java·前端·json
志尊宝13 小时前
AI原生前端开发(009):AI辅助性能分析与优化建议
人工智能·react.js·ai-native