react笔记之memo

memo 是一个高阶组件 (HOC) ,用于优化整个组件的重新渲染。

作用

记忆组件的渲染结果。

优化性能:memo会对 props 进行浅比较,如果 props 没有变化,组件就不会重新渲染。如果父组件频繁重新渲染,而这个组件的 props 没有变化,使用``memo`` 可以避免不必要的重新渲染。

保持表单状态 :虽然表单form使用的是 useRef 而不是 useState,但如果使用 memo 可以避免组件被卸载和重新挂载,从而保持表单的状态。

注意:如果props有函数,且函数在父组件中没有用``useCallback`` 包裹,那么每次父组件渲染时,这些函数引用都会变化,导致``memo`` 失效。

举例

子组件

javascript 复制代码
import { DynamicForm, DynamicFormRef, ConfirmDeleteDialog } from '@/components/dynamic-form';
import { memo, useRef } from 'react';

export const RpDialog = memo(
  ({
    handleClick,
    hidden = false,
    visible = true,
    hideModal,
  }) => {
    const formCallbackRef = useRef<DynamicFormRef>(null);

    return (
      <ConfirmDeleteDialog >
         <DynamicForm
                ref={formCallbackRef}
         >
               {/* {children} */}
              </DynamicForm>
        {/* {children} */}
      </ConfirmDeleteDialog>
    );
  },
);

父组件

TypeScript 复制代码
<section>
    {rpDialogVisible && (
          <RpDialog
            hidden={true}
            handleClick={handleClick}
            visible={rpDialogVisible}
            hideModal={hideRpDialogModal}
          ></RpDialog>
        )}
</section>

如果不使用 memo :

  • 每次父组件重新渲染时, RpDialog 都会重新渲染
  • 即使对话框不可见( hidden={true} ),也会执行渲染逻辑
  • 表单 ref 和回调函数会重新创建

使用 memo 后:

  • 只有当 props( handleClick 、 hidden 、 visible 、 hideModal )真正变化时才重新渲染
  • 父组件因搜索、筛选等操作重新渲染时, RpDialog 会被跳过
  • 减少不必要的 DOM 操作和组件渲染

memo和useMemo区别

特性 memo useMemo
类型 memo是一个高阶组件HOC useMemo是一个hook
优化对象 优化整个组件的渲染 值级别的优化,函数的返回值
使用位置 组件定义外层 组件内部
作用 记忆组件的渲染结果 只有当 props 发生变化时才重新渲染 跳过父组件重新渲染时子组件的不必要渲染 缓存函数的返回值 只有依赖项变化时才重新计算 避免每次渲染都执行昂贵的计算
依赖检查 props变化 数组变化
相关推荐
Moshow郑锴几秒前
npm国内镜像加速之使用 nrm 工具(灵活切换,适合多环境)
前端·npm·node.js
flytam2 分钟前
Claude Agent SDK 深度入门指南 审核中
前端·人工智能·aigc
你猜猜吧4 分钟前
里程三:DSL总结
前端
JarvanMo4 分钟前
当 Flutter 撞上 3D 性能之墙 —— Fluorite(萤石)
前端
Eagle_Clark4 分钟前
从0到1 Vibe Coding 一个项目的真实感受
前端·人工智能·后端
CodeSheep5 分钟前
兄弟被降职降薪,被猎头挖新公司时承诺45万年薪,结果签合同才发现这45万里有“部分”是股权激励,还得2年后才能兑现
前端·后端·程序员
sheeta19989 分钟前
LeetCode 每日一题笔记 日期:2025.04.06 题目:874. 模拟行走机器人
笔记·leetcode·机器人
weixin1997010801612 分钟前
《界面网商品详情页前端性能优化实战》
前端·性能优化
oi..18 分钟前
Linux入门(2)
linux·笔记·测试工具·安全·网络安全
Mintopia20 分钟前
界面上的小细节,决定用户会不会骂产品
前端