当前位置: 首页 > article >正文

React.memo 和useMemo 的区别

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

1. React.memo

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

  • 主要用途:
    用于组件级别的性能优化。
    缓存组件的渲染结果,避免因父组件重新渲染而导致不必要的子组件渲染。
    它是一个包裹组件的高阶函数。

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

  • 使用示例:

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

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

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

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 会返回缓存的结果。如果依赖项发生变化,它就会重新计算结果。

  • 使用示例:

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 时。


http://www.kler.cn/a/420687.html

相关文章:

  • 在鲲鹏麒麟服务器上部署MySQL主从集群
  • 【Vue3】【Naive UI】<NAutoComplete>标签
  • 什么是 Kubernetes(K8s)?
  • ESP32-S3模组上跑通ES8388(13)
  • uniapp使用扩展组件uni-data-select出现的问题汇总
  • 二百七十八、ClickHouse——将本月第一天所在的那一周视为第一周,无论它是从周几开始的,查询某个日期是本月第几周
  • Python 调用 Umi-OCR API 批量识别图片/PDF文档数据
  • 【前端】小程序实现预览pdf并导出
  • Argon2-cffi:Python中的密码学哈希库
  • AI 计算基础设施的战略转折点分析
  • C++ 变量和常量:开启程序构建之门的关键锁钥与永恒灯塔
  • Go-MediatR:Go语言中的中介者模式
  • 基于 Vite 封装工具库实践
  • ABE 中的隐藏属性:DIPPE(去中心化内积谓词加密)
  • linux 压缩命令,压缩a目录,但是不压缩a目录下的b目录,zip命令
  • termius mac版无需登录注册直接永久使用
  • Mybatis 复习
  • MySQL 数据库学习教程二:深入 MySQL 数据库世界
  • uniapp进阶技巧:如何优雅地封装request实例
  • 《嵌入式硬件设计》
  • 架构学习第五周--Kubernetes(一)
  • python基础(六)
  • 依赖注入之登录验证(Java EE 学习笔记08)
  • [JuMP.jl] 线性规划
  • 107.【C语言】数据结构之二叉树求总节点和第K层节点的个数
  • 针对Qwen-Agent框架的Function Call及ReAct的源码阅读与解析:Agent基类篇