react18中在列表中如何使用useCallback进行渲染优化

ops/2024/10/22 8:37:33/

实现的需求:在列表中如何缓存每个子组件,父组件重新渲染,子组件不更新,下面的列子假设 Chart 组件被包裹在memo 中。你希望在 ReportList 组件重新渲染时跳过重新渲染列表中的每个 Chart。但是,你不能在循环中调用 useCallback

实现效果请添加图片描述

  • 代码逻辑

ReportList.js

import { useCallback, useState } from "react";
import Chart from "./Chart";
function sendReport(item) {console.log("Sending report for", item);
}function ReportList({ items }) {const [msg, setMsg] = useState("hello");function handleChange(e) {setMsg(e.target.value);console.log(msg);}return (<article>{items.map((item) => {// 🔴 你不能在循环中调用 useCallback:// const handleClick = useCallback(() => {//  sendReport(item)//}, [item]);//return (//  <figure key={item.id}>//    <Chart onClick={handleClick} />//  </figure>//);return <Report key={item.id} item={item} />;})}<input type="text" value={msg} onChange={handleChange} /></article>);
}function Report({ item, onClick }) {const handleClick = useCallback(() => {sendReport(item);}, [item]);return (<figure key={item.id}><Chart onClick={handleClick} /></figure>);
}export default ReportList;

注意:我们不能在迭代中使用useCallback
在这里插入图片描述

在这里插入图片描述
Chart.js

function Chart({ onClick }) {console.log("chart");return <button onClick={onClick}>Send Report</button>;
}
export default Chart;

发现chart组件还是会重新渲染,这个不是我们想要的效果。对代码进行改写

import { memo } from "react";const Chart = memo(function ({ onClick }) {console.log("chart");return <button onClick={onClick}>Send Report</button>;
});
export default Chart;

请添加图片描述
这样,我们就实现了效果。


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

相关文章

Web页面测试方法「详细介绍」

Web页面测试方法「详细介绍 」 一、Web页面常见控件概述二、功能测试方法2.1 文本框&#xff08;Input Field&#xff09;2.2 下拉菜单&#xff08;Dropdown List&#xff09;2.3 按钮&#xff08;Button&#xff09;2.4 复选框&#xff08;Checkbox&#xff09;2.5 单选按钮&a…

【Java 22 | 7】 深入解析Java 22 :密封类(Sealed Classes)增强详解

Java 22 对密封类(Sealed Classes)进行了重要的增强,使得这一特性在类型安全和设计灵活性方面更加出色。以下是对密封类的详细介绍,包括基础概念、增强特性、丰富的使用场景示例,以及实际项目中的应用示例。 1. 基础介绍 什么是密封类(Sealed Classes) 密封类是 Java…

APQP在制造行业的应用:搭上数字化项目管理平台很nice

APQP&#xff08;Advanced Product Quality Planning&#xff0c;即产品质量先期策划&#xff09;最早由汽车行业引入&#xff0c;并因其在质量管理方面的显著效果而逐渐被其他制造业领域所采纳。 APQP提供了一种从产品设计的最初阶段到生产过程的全面质量管理框架&#xff0…

K8S调度不平衡问题分析过程和解决方案

不平衡问题排查 问题描述&#xff1a; 1、业务部署大量pod(据反馈&#xff0c;基本为任务型进程)过程中&#xff0c;k8s node内存使用率表现不均衡&#xff0c;范围从80%到百分之几&#xff1b; 2、单个node内存使用率超过95%&#xff0c;仍未发生pod驱逐&#xff0c;存在node…

springboot接口Get请求实体类入参

在springboot中&#xff0c;对HTTP GET请求&#xff0c;通常不会将请求体&#xff08;body&#xff09;作为主要的数据传输方式&#xff0c;因为GET请求通常用于请求数据&#xff0c;而不是发送数据到服务器&#xff08;尽管从技术上讲&#xff0c;GET请求可以包含请求体&#…

生成文件夹 - python 实现

生成文件夹保存图片和文本等信息。 代码具体实现如下&#xff1a; #-*-coding:utf-8-*- # date:2021-04-13 # Author: DataBall - XIAN # Function: 生成文件夹import os if __name__ "__main__":path "./dataset"if not os.path.exists(path): # 如果…

SCR相对标准偏差、氨氮比、截面速度,多平面计算

SCR截面速度、氨氮比等标准及相对标准偏差计算。 程序用来处理fluent通过xyplot导出的数据&#xff0c;导出可以选择多个平面&#xff0c;可计算标准偏差SD、相对标准偏差RSD&#xff0c;平均速度,适用于求解多个平面 # -*- coding: utf-8 -*- """ Created on …

无人机:无线电波控制技术!

一、无线电波控制技术 通过无线电波与无人机上的接收机进行通信。当飞手在遥控器上操作控制杆时&#xff0c;这些动作会被转换为无线电波信号&#xff0c;并发送给无人机上的接收机。接收机接收到信号后&#xff0c;会解读控制杆的位移&#xff0c;并将其转化为数字信号&#…