React高阶组件——React.momo

父子组件的渲染规律

因为子组件是父组件的一部分,默认父组件发生变化时候子组件也会重新渲染。

react.memo的提出

但是当子组件状态变化触发重新渲染时,父组件不会重新触发,因为为避免不必要的渲染,会缩在最小范围内。就不会让父组件也发生重新渲染。 但是如果子组件非常复杂,还要在每次父组件重新渲染的时候跟着被渲染,就会产生 无意义的损耗。 为此,用react.memo来缓存子组件,当子组件的状态没变化时候就不用重新渲染。当子组件真的变化了,再重新渲染,重新缓存。

使用方法:

从react中解构出来memo const {memo}=react 用memo包裹子组件

js 复制代码
    const Child=memo(()=>{
      return <>
      <h1>{count}</h1>
      <button onClick={()=>setcount(count+1)}>+</button>
      <button onClick={()=>setcount(count-1)}>-</button>
      </>
    })

意思就是memo括号中的整个作为一个参数,memo就返回一个已经缓存化/记忆化的这样一个组件child。 父组件里面不变,直接用<child/>

重新缓存的情况:

  1. props组件嵌套属性改变
  2. state组件自身状态改变
  3. useContext跨组件通信数据改变

重新缓存失败的情况:

  • 复杂数据类型(引用类型) :数组 (arr)、函数 (fn)、对象等是通过引用地址 传递的。每次父组件重新渲染时,即使内容未变,这些值也会被重新创建 ,导致内存地址变化,React.memo 的浅比较会认为 props 发生了变化,从而触发子组件重新渲染。

  • 简单数据类型(原始类型) :如 stringnumberbooleannullundefinedsymbol 等,直接比较值是否相同,不会因内存地址问题引发重新渲染。

  • 解决方法:

    1. 使用 useMemo 缓存数组/对象
      避免父组件每次渲染时重新创建引用:
    ini 复制代码
    const memoizedArr = useMemo(() => [1, 2, 3], []);
    <ChildComponent arr={memoizedArr} />
  1. 使用 useCallback 缓存函数

    确保函数引用不变:

    ini 复制代码
    const memoizedFn = useCallback(() => {}, []);
    <ChildComponent fn={memoizedFn} />
  2. 自定义 areEqual 比较函数

    手动控制 React.memo 的 props 比较逻辑:

    csharp 复制代码
    const areEqual = (prevProps, nextProps) => {
      return prevProps.arr.join() === nextProps.arr.join();
    };
    export default React.memo(ChildComponent, areEqual);
相关推荐
Mr Xu_3 小时前
Vue 3 中 watch 的使用详解:监听响应式数据变化的利器
前端·javascript·vue.js
AAA阿giao3 小时前
从零拆解一个 React + TypeScript 的 TodoList:模块化、数据流与工程实践
前端·react.js·ui·typescript·前端框架
hedley(●'◡'●)4 小时前
基于cesium和vue的大疆司空模仿程序
前端·javascript·vue.js·python·typescript·无人机
百思可瑞教育4 小时前
构建自己的Vue UI组件库:从设计到发布
前端·javascript·vue.js·ui·百思可瑞教育·北京百思教育
CappuccinoRose4 小时前
JavaScript 学习文档(二)
前端·javascript·学习·数据类型·运算符·箭头函数·变量声明
全栈前端老曹5 小时前
【MongoDB】深入研究副本集与高可用性——Replica Set 架构、故障转移、读写分离
前端·javascript·数据库·mongodb·架构·nosql·副本集
NCDS程序员5 小时前
v-model: /v-model/ :(v-bind)三者核心区别
前端·javascript·vue.js
小杨同学呀呀呀呀5 小时前
Ant Design Vue <a-timeline>时间轴组件失效解决方案
前端·javascript·vue.js·typescript·anti-design-vue
qq_532453536 小时前
使用 Three.js 构建沉浸式全景图AR
开发语言·javascript·ar
Mr Xu_14 小时前
告别冗长 switch-case:Vue 项目中基于映射表的优雅路由数据匹配方案
前端·javascript·vue.js