React.memo 和useMemo 的区别

React.memo 和 useMemo 都是 React 中的性能优化工具,但它们的用途和工作原理不同。以下是它们的主要区别:

1. React.memo

React.memo 是一个高阶组件(HOC),用于优化组件的渲染,防止不必要的重新渲染。当组件的 props 没有变化时,React.memo 会阻止组件的重新渲染。

  • 主要用途:

    用于组件级别的性能优化。

    缓存组件的渲染结果,避免因父组件重新渲染而导致不必要的子组件渲染。

    它是一个包裹组件的高阶函数。

  • 工作原理:

    React.memo 会对比当前渲染和之前的 props,如果 props 没有变化,它就跳过重新渲染。如果 props 发生变化,则会重新渲染组件。

  • 使用示例:

bash 复制代码
const MyComponent = React.memo(({ count }: { count: number }) => {
  console.log('Rendering MyComponent');
  return <div>{count}</div>;
});

在父组件的重新渲染时,MyComponent 只有在 count 发生变化时才会重新渲染。

可以传递自定义比较函数:

bash 复制代码
const MyComponent = React.memo(
  ({ count }: { count: number }) => {
    console.log('Rendering MyComponent');
    return <div>{count}</div>;
  },
  (prevProps, nextProps) => prevProps.count === nextProps.count // 自定义比较函数
);

2. useMemo

useMemo 是一个 React Hook,用于在函数组件内部缓存计算结果。它的作用是缓存某个计算值,避免每次渲染时都重新执行计算。

  • 主要用途:

    用于缓存计算值,避免在每次渲染时都执行开销较大的计算。

    useMemo 返回缓存的值,只有在依赖项发生变化时才会重新计算。

  • 工作原理:

    useMemo 会根据传递的依赖数组进行比较。如果依赖项没有变化,useMemo 会返回缓存的结果。如果依赖项发生变化,它就会重新计算结果。

  • 使用示例:

bash 复制代码
import React, { useMemo } from 'react';

const ExpensiveComponent = ({ num }: { num: number }) => {
  const expensiveCalculation = useMemo(() => {
    console.log('Expensive calculation...');
    return num * 2; // 假设这个计算非常耗时
  }, [num]); // 依赖项为 num,只有 num 发生变化时才会重新计算

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

在这个例子中,只有当 num 发生变化时,expensiveCalculation 才会重新计算,否则会使用上次计算的缓存值。

3.主要区别总结:

4.何时使用:

使用 React.memo 当你想要优化子组件的渲染性能时,特别是在传递给子组件的 props 没有变化时。

使用 useMemo 当你有一个计算开销大的值,并且这个值的计算依赖于某些特定的 props 或 state 时。

相关推荐
2401_878454531 天前
浏览器工作原理
前端·javascript
by__csdn1 天前
Vue3 setup()函数终极攻略:从入门到精通
开发语言·前端·javascript·vue.js·性能优化·typescript·ecmascript
Luna-player1 天前
在前端中,<a> 标签的 href=“javascript:;“ 这个是什么意思
开发语言·前端·javascript
lionliu05191 天前
js的扩展运算符的理解
前端·javascript·vue.js
小草cys1 天前
项目7-七彩天气app任务7.4.2“关于”弹窗
开发语言·前端·javascript
前端一小卒1 天前
一个看似“送分”的需求为何翻车?——前端状态机实战指南
前端·javascript·面试
syt_10131 天前
Object.defineProperty和Proxy实现拦截的区别
开发语言·前端·javascript
长安牧笛1 天前
儿童屏幕时间管控学习引导系统,核心功能,绑定设备,设时长与时段,识别娱乐,APP超时锁屏,推荐益智内容,生成使用报告,学习达标解锁娱乐
javascript
栀秋6661 天前
深入浅出链表操作:从Dummy节点到快慢指针的实战精要
前端·javascript·算法
青青很轻_1 天前
Vue自定义拖拽指令架构解析:从零到一实现元素自由拖拽
前端·javascript·vue.js