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变化 数组变化
相关推荐
用户059540174465 小时前
Redis缓存回滚踩坑实录:一个配置失误,让我在凌晨3点丢了3000条数据
前端·css
kyriewen6 小时前
别再这样写条件渲染了——你的React组件里藏着这5种定时炸弹
前端·javascript·react.js
IT_陈寒6 小时前
Redis缓存击穿把我坑惨了,原来这样设过期时间才靠谱
前端·人工智能·后端
用户938515635076 小时前
从"坐电梯"到"前端路由"——深入理解 Hash 路由原理
前端·typescript·全栈
梦想CAD控件7 小时前
网页端CAD的图形选择、编辑与夹点操作教程
前端·javascript·node.js
妙码生花7 小时前
从 PHP 到 AI + Golang,程序员自救转型手记(五十二):管理员权限检查中间件,AI 随意放行预闯大祸
前端·后端·go
月月大王的3D日记7 小时前
Three.js 入门系列(8):六种光源全解析 —— 关灯了,开光!
前端·javascript
属于自己的天空8 小时前
每天省去重复 Prompt:我用 Skills 把 CRUD 生成标准化了
前端·后端
卡卡罗特AI8 小时前
GitHub怎么用?零基础,保姆级使用教程-上!建议收藏
前端·后端·github