想象一下,你有一个显示天气预报的手机应用。其中有一个区域专门显示当前温度。

  • 父组件:就像整个天气预报的大屏幕。
  • 子组件:就像大屏幕上的温度计小模块,只负责显示一个数字(比如 data={25})。

现在,如果大屏幕上的其他信息变了(比如风速从3级变成4级,或者天气预报员头像在闪烁),整个大屏幕都会收到“快更新!”的信号。

问题来了:那个只显示温度的“温度计小模块”也会跟着瞎忙活,重新刷新自己。即使温度还是25度,根本没变!这种不必要的刷新就是在浪费手机的电量和计算能力,如果应用里有很多这样的“勤快”组件,手机就会变卡、变慢。

代码解释:给组件装上“记忆功能”和“偷懒许可”

我们这段代码的目的,就是告诉这个“温度计小模块”:“除非你接收到的温度数据真的变了,否则你就别动,继续显示原来的数字。”

第一行:导入工具

import React, { memo } from 'react';
  • 这就像你要做一道菜,先从工具箱里拿出需要的厨具。
  • memo 就是我们要用的那个神奇工具,它的全称是 memory(记忆),功能就是让组件拥有“记忆”,学会“偷懒”。

第一部分:基础用法 - “自动记忆模式”

const ExpensiveComponent = memo(({ data }) => {
  return <Text>{data}</Text>;
});
  • 我们创建了一个叫 ExpensiveComponent(昂贵的组件)的“温度计模块”。说它“昂贵”是因为它如果瞎刷新会很耗性能。

  • memo(...) 把这个组件包裹了起来。这就相当于给它穿上了一件 “智能盔甲”。

    • 这件盔甲的作用是:每次父组件更新时,它会自动检查传给这个子组件的 data(温度数据)和上一次比有没有变化。
    • 如果 data 没变(温度还是25度):盔甲就会说:“数据没变,你不用刷新了,继续歇着吧!” 组件就不会重新渲染。
  • 如果 data 变了(温度从25度变成了26度):盔甲就会说:“新数据来了,快起来工作!” 组件就会正常更新显示。

简单比喻:这就好比你的朋友问你时间,你看了一眼手表告诉他是“3点05分”。如果他每隔10秒就问一次,你不需要每次都低头看手表,只需要在时间真的变成“3点06分”的时候再告诉他新时间。

第二部分:高级用法 - “自定义比较模式”

const CustomMemoComponent = memo(ExpensiveComponent, (prevProps, nextProps) => {
  return prevProps.id === nextProps.id;
});

有时候,自动检查不够智能。比如,组件接收到的不是一个简单的数字,而是一个复杂的“天气预报对象”,里面包含温度、湿度、风速等很多信息。

  • 我们创建了另一个组件 CustomMemoComponent。

  • memo 的第二个参数是一个函数,它就像是我们给“智能盔甲”设定的 “自定义偷懒规则”。

  • 这个函数接收两个参数:

    • prevProps:上一次的“天气预报对象”。
    • nextProps:下一次的“天气预报对象”。
    • 我们的规则是:return prevProps.id === nextProps.id;
    • 这条规则的意思是:我只看这个对象的 id 有没有变化。
    • 只要这个天气预报的 id 没变(比如都是“北京今日天气”的ID),那么即使里面的温度、风速等细节变了,这个组件也不用更新!

什么时候用?
假设这个组件只负责显示城市名称,不关心具体天气数据。那么即使温度从25度变到40度,只要城市还是“北京”(id 没变),它就没必要刷新。
总结一下:

代码部分 理解
memo(Component) 给组件装上“自动记忆盔甲”,只有收到的所有数据变了才刷新。
memo(Component, compareFunction) 给“盔甲”设定“自定义偷懒规则”,只根据你关心的特定数据(如id)来决定是否刷新。

通过记忆(memoization)来避免React组件做无用功,从而提升应用性能。 这是React优化技巧中非常基础且重要的一环。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐