react 中 memo 模块作用

ops/2024/11/17 18:25:08/

`memo`是一个用于优化组件性能的高阶组件。

一、避免不必要的重新渲染

1. 浅比较机制原理

1.1 组件渲染触发条件

在 React 中,当组件的`props`或`state`发生变化时,组件会重新渲染。然而,在某些情况下,即使父组件重新渲染并传递给子组件相同的`props`,子组件也不需要重新渲染。`memo`模块通过对组件的`props`进行浅比较来解决这个问题。浅比较会检查`props`对象的引用是否发生变化,如果`props`的引用没有改变,并且组件是一个纯函数组件(没有内部状态或副作用),那么`memo`会阻止子组件的重新渲染。

1.2 代码示例

javascript">import { memo } from "react";const MyComponent = memo((props) => {return <div>{props.value}</div>;});export default MyComponent;

2. 性能优化效果

2.1 提升应用性能

例如:在一个列表组件中,每个列表项都是一个子组件,如果列表项的内容没有变化,使用`memo`可以防止列表项组件在父组件重新渲染时重新渲染。

2.2 减少渲染成本

每次组件重新渲染都需要重新执行组件函数,生成新的虚拟 DOM,然后与旧的虚拟 DOM 进行比较,这个过程会消耗一定的计算资源。`memo`通过阻止不必要的重新渲染,减少了这些渲染成本,尤其是在组件树较深或组件更新频繁的场景中,效果更加明显。

二、与函数组件的协同作用

1. 保持函数组件的纯洁性

1.1 纯函数组件概念

纯函数组件是指没有副作用且对于相同的输入总是返回相同输出的组件。`memo`与纯函数组件配合得很好,因为它的浅比较机制基于纯函数组件的特性。当一个函数组件被`memo`包裹后,它更符合纯函数的定义,即只要`props`不变,组件的输出(渲染结果)就不会改变。

1.2 代码示例

javascript">import { memo } from "react";const PureFunctionComponent = memo((props) => {// 这里没有副作用,只是根据传入的props渲染内容return <div>{props.text}</div>;});export default PureFunctionComponent;

2. 处理函数组件的依赖关系

2.1 函数组件中的依赖管理

例如:如果一个组件依赖于一个外部的格式化函数,当这个函数作为`props`传递给被`memo`包裹的组件时,`memo`会检测到这个`props`的变化并正确处理组件的重新渲染。

2.2 代码示例

javascript">import { memo } from "react";const formatText = (text) => text.toUpperCase();const FunctionComponentWithDependency = memo((props) => {const formattedText = formatText(props.text);return <div>{formattedText}</div>;});export default FunctionComponentWithDependency;

三、与 React 其他特性的结合

1. 与 React Context 的结合使用

1.1 优化 Context 的消费组件

例如:在一个主题切换的应用中,有一个通过 Context 提供的主题颜色数据,使用`memo`包裹的组件可以在主题颜色没有直接影响其`props`时避免重新渲染。

1.2 代码示例

javascript">import { memo, useContext, createContext } from "react";const ThemeContext = React.createContext();const ThemedComponent = memo((props) => {const theme = useContext(ThemeContext);// 这里只使用了与props相关的逻辑,不受ThemeContext变化的直接影响return <div style={{ color: props.textColor }}>{props.text}</div>;});export default ThemedComponent;

2. 与 React Hooks 的结合使用

2.1 配合 Hooks 实现复杂功能

例如:在一个使用`useEffect`来获取数据的组件中,`memo`可以防止组件在数据获取逻辑没有改变且`props`不变的情况下重新渲染。

2.2 代码示例

javascript">import { memo, useState, useEffect } from "react";const DataFetchingComponent = memo((props) => {const [data, setData] = useState(null);useEffect(() => {// 模拟数据获取逻辑const fetchData = async () => {const result = await fetch(props.url);const jsonData = await result.json();setData(jsonData);};fetchData();}, [props.url]);return <div>{data ? data.toString() : "Loading..."}</div>;});export default DataFetchingComponent;


http://www.ppmy.cn/ops/134494.html

相关文章

STM32 ADC --- 任意单通道采样

STM32 ADC — 单通道采样 文章目录 STM32 ADC --- 单通道采样cubeMX配置代码修改&#xff1a;应用 使用cubeMX生成HAL工程 需求&#xff1a;有多个通道需要进行ADC采样&#xff0c;实现每次采样只采样一个通道&#xff0c;且可以随时采样不同通道的功能。 cubeMX配置 这里我们…

HarmonyOS4+NEXT星河版入门与项目实战--------开发工具与环境准备

文章目录 1、熟悉鸿蒙官网1、打开官网2、下载 DevEco Studio3、HarmonyOS 资源库4、开发指南与API 2、安装 DevEco Studio1、软件安装2、配置开发工具 1、熟悉鸿蒙官网 1、打开官网 百度搜索 鸿蒙开发者官网 点击进入开发者官网&#xff0c;点击开发&#xff0c;可以看到各种…

leetcode 扫描线专题 06-leetcode.252 meeting room 力扣.252 会议室

扫描线专题 leetcode 扫描线专题 06-扫描线算法&#xff08;Sweep Line Algorithm&#xff09; leetcode 扫描线专题 06-leetcode.218 the-skyline-problem 力扣.218 天际线问题 leetcode 扫描线专题 06-leetcode.252 meeting room 力扣.252 会议室 leetcode 扫描线专题 06…

【React】状态管理之Zustand

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 状态管理之Zustand引言1. Zustand 的核心特点1.1 简单直观的 API1.2 无需 Provi…

【Linux篇】面试——用户和组、文件类型、权限、进程

目录 一、权限管理 1. 用户和组 &#xff08;1&#xff09;相关概念 &#xff08;2&#xff09;用户命令 ① useradd&#xff08;添加新的用户账号&#xff09; ② userdel&#xff08;删除帐号&#xff09; ③ usermod&#xff08;修改帐号&#xff09; ④ passwd&…

idea 添加内嵌代码作者-方法添加作者-设置方法作者-设置[code author]--设置代码修改作者和修改时间

这个设置还是有点难的。在网络上资料比较少&#xff0c;找了好久才找到&#xff0c;这里记录一下。 当团队合作编辑代码时&#xff0c;代码中方法的添加修改设置作者和修改时间很重要。 具体方法&#xff1a; 这里大体原理就是&#xff0c;显示的作者是git配置的用户账户信息…

删库跑路,启动!

起因&#xff1a;这是一个悲伤的故事&#xff0c;在抓logcat时 device待机自动回根目录了&#xff0c;而题主对当前路径的印象还停留在文件夹下&#xff0c;不小心在根目录执行了rm -rf * … 所以&#xff0c;这是个悲伤的故事&#xff0c;东西全没了…device也黑屏了&#xff…

uniapp中h5端如何引用本地json数据(json文件)

前言 uniapp读取本地json数据文件&#xff0c;有下面两种方式可以实现&#xff1a; 文件后缀为.json类型文件后缀为.js类型 这里展示后缀为.js类型的处理方式 1、在static中创建后缀为.js的文件存储json数据。 注意使用export导出 2、在要使用的页面导入 <template>…