react 中 memo 模块作用

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

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

1. 浅比较机制原理

1.1 组件渲染触发条件

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

1.2 代码示例

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 代码示例

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 代码示例

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 代码示例

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 代码示例

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.rhkb.cn/news/472093.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode654.最大二叉树

LeetCode刷题记录 文章目录 &#x1f4dc;题目描述&#x1f4a1;解题思路⌨C代码 &#x1f4dc;题目描述 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值为 nums 中的最大值。 递归地在最大值 左边 的 子…

电子应用产品设计方案-9:全自动智能马桶系统设计方案

一、系统概述 本全自动智能马桶系统旨在提供舒适、卫生、便捷和智能化的如厕体验。通过融合多种传感器技术、电子控制单元和机械执行机构&#xff0c;实现马桶的自动冲洗、座圈加热、臀部清洗、烘干等功能&#xff0c;并具备智能感应、用户个性化设置和健康监测等特色功能。 二…

酒水分销积分商城小程序开发方案php+uniapp

酒水分销积分商城小程序开发&#xff0c;开发语言后端php&#xff0c;前端uniapp。核心功能模块&#xff1a;酒水商城、积分商城、二级分销、抽奖、优惠券。可以二开或定制。协助部署搭建。

UNIX网络编程-TCP套接字编程(实战)

概述 TCP客户端/服务器程序示例是执行如下步骤的一个回射服务器&#xff1a; 客户端从标准输入读入一行文本&#xff0c;并写给服务器。服务器从网络输入读入这行文本&#xff0c;并回射给客户端。客户端从网络输入读入这行回射文本&#xff0c;并显示在标准输出上。 TCP服务器…

Kafka-Eagle的配置——kafka可视化界面

通过百度网盘分享的文件&#xff1a;kafka-eagle-bin-2.0.8.tar.gz 链接&#xff1a;https://pan.baidu.com/s/1H3YONkL97uXbLTPMZHrfdg?pwdsltu 提取码&#xff1a;sltu 一、界面展示 二、软件配置 1、关闭kafka集群 kf.sh stop 2、将该软件上传到/opt/modules下 cd /opt…

Uniapp踩坑input自动获取焦点ref动态获取实例不可用

前言 大家好我是没钱的君子下流坯&#xff0c;用自己的话解释自己的知识。很久很更新了&#xff0c;这几个月一直在加班&#xff0c;今天记录一个uniapp关于input中focus()方法自动获取焦点的坑。 案例 为了实现一个手机验证码的页面&#xff0c;验证码是五个输入框&#xf…

报错 No available slot found for the embedding model

报错内容 Server error: 503 - [address0.0.0.0:12781, pid304366] No available slot found for the embedding model. We recommend to launch the embedding model first, and then launch the LLM models. 目前GPU占用情况如下 解决办法: 关闭大模型, 先把 embedding mode…

AI大模型(二):AI编程实践

一、软件安装 1. 安装 Visual Studio Code VSCode官方下载&#xff1a;Visual Studio Code - Code Editing. Redefined 根据自己的电脑系统选择相应的版本下载 安装完成&#xff01; 2. 安装Tongyi Lingma 打开VSCode&#xff0c;点击左侧菜单栏【extensions】&#xff0c;…

MFC程序崩溃时生成dmp文件

#include “HiExceptionHandle.h” #include <string> #pragma once class HiExceptionHandle { public:HiExceptionHandle(void);~HiExceptionHandle(void); public:void RunCrashHandler();void SetWERDumpLocation(const std::wstring dumpFolderPath); protected:st…

释放高级功能:Nexusflows Athene-V2-Agent在工具使用和代理用例方面超越 GPT-4o

在不断发展的人工智能领域&#xff0c;Nexusflows 推出了 Athene-V2-Agent 作为其模型系列的强大补充。这种专门的代理模型设计用于在功能调用和代理应用中发挥出色作用&#xff0c;突破了人工智能所能达到的极限。 竞争优势 Athene-V2-Agent 不仅仅是另一种人工智能模型&…

Flutter:input输入框

输入框&#xff1a; // 是否显示关闭按钮 bool _showClear false; // 文字编辑控制器&#xff0c;监听搜索框的变化。 final TextEditingController _controller TextEditingController(); // 输入框发生变化事件 void _onChange(String value){if(value.length > 0){setS…

vue 项目使用 nginx 部署

前言 记录下使用element-admin-template 改造项目踩过的坑及打包部署过程 一、根据权限增加动态路由不生效 原因是Sidebar中路由取的 this.$router.options.routes,需要在计算路由 permission.js 增加如下代码 // generate accessible routes map based on roles const acce…

鸿蒙next ui安全区域适配(刘海屏、摄像头挖空等)

目录 相关api 团结引擎对于鸿蒙的适配已经做了安全区域的适配&#xff0c;也考虑到了刘海屏和摄像机挖孔的情况&#xff0c;在团结引擎内可以直接使用Screen.safeArea 相关api 团结引擎对于鸿蒙的适配已经做了安全区域的适配&#xff0c;也考虑到了刘海屏和摄像机挖孔的情况&am…

多端校园圈子论坛小程序,多个学校同时代理,校园小程序分展示后台管理源码

社团活动与组织 信息发布&#xff1a;系统支持社团发布活动信息、招募新成员等&#xff0c;方便社团进行线上线下活动的组织和管理。 增强凝聚力&#xff1a;通过系统&#xff0c;社团成员可以更好地交流和互动&#xff0c;增强社团的凝聚力和影响力。 生活服务功能 二手市场…

SpringCloud-使用FFmpeg对视频压缩处理

在现代的视频处理系统中&#xff0c;压缩视频以减小存储空间、加快传输速度是一项非常重要的任务。FFmpeg作为一个强大的开源工具&#xff0c;广泛应用于音视频的处理&#xff0c;包括视频的压缩和格式转换等。本文将通过Java代码示例&#xff0c;向您展示如何使用FFmpeg进行视…

MySQL-初识数据库

目录 一、数据库基础概念 1、SQL 2、数据&#xff08;Data&#xff09; 3、数据库&#xff08;DB&#xff09; 4、数据库管理系统DBMS 5、数据库系统DBS 6、关系模型&#xff08;Relational Model&#xff09; 7、E-R图 8、常见的数据库 9、数据库基本操作 一、数据库…

【C语言】实现二维数组按列排序

文章目录 代码实现代码解释注意事项 代码实现 下面是一个C语言程序&#xff0c;它读取用户输入的4行5列的二维数组&#xff0c;并按照列对数组进行排序。 #include <stdio.h>int main() {int a[4][5]; // 定义一个4行5列的二维数组// 读取用户输入的二维数组for (int i…

aws ses 设置发件人昵称

看到别人的发的都是有昵称的&#xff0c;自己发的就是直接展示noreply 其实很简单&#xff1a; 只需要把发件人改成“nickname<noreplyxxx.com>”就行了

51c大模型~合集42

我自己的原文哦~ https://blog.51cto.com/whaosoft/11859244 #猎户座 「草莓」即将上线&#xff0c;OpenAI新旗舰大模型曝光&#xff0c;代号「猎户座」 ChatGPT 要进化了&#xff1f; 本月初&#xff0c;OpenAI 创始人、CEO 山姆・奥特曼突然在 X 上发了一张照片&#xff0…

【算法】二分查找

基本内容 提高在有序的数组中查找满足某一条件的索引 二分查找的基本类型 ① 有多种情况满足条件&#xff0c;找到满足条件的最右索引&#xff0c;例如找到值为4的最右索引&#xff08;也可以换为小于5的最后一个元素&#xff09; ​ ② 有多种情况满足条件&#xff0c;找到满…