React-Native memo 的使用与理解
React组件优化技巧:使用memo避免不必要的重新渲染。父组件更新时,子组件若接收的props未变化,通过memo包裹可跳过渲染过程。基础用法用memo(Component)自动浅比较props;高级用法通过memo第二个参数自定义比较逻辑,如仅对比id字段。这种记忆化(memoization)能显著提升性能,特别适合渲染成本高的组件。合理使用memo可减少无效计算,优化应用运行效率。
想象一下,你有一个显示天气预报的手机应用。其中有一个区域专门显示当前温度。
- 父组件:就像整个天气预报的大屏幕。
- 子组件:就像大屏幕上的温度计小模块,只负责显示一个数字(比如 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优化技巧中非常基础且重要的一环。
更多推荐
所有评论(0)