当前位置: 首页 > article >正文

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

实现的需求:在列表中如何缓存每个子组件,父组件重新渲染,子组件不更新,下面的列子假设 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.kler.cn/news/359882.html

相关文章:

  • 大模型的检索增强生成综述研究
  • 利用TLP185光耦合器增强电路隔离和信号完整性
  • (AtCoder Beginner Contest 375) 题解(下)
  • 408 10——42题
  • [英语单词] sk_under_memory_pressure
  • MySQL 初阶——多版本控制 MVCC
  • Tkinter -- python GUI学习与使用
  • 1.前提配置 关防火墙 关selinux
  • 每日一题|910.最小差值II|数组排序思路、单调性
  • 深入理解Python函数
  • SAP B1 账套锁定解决方案
  • 【渗透测试】-红日靶场-获取web服务器权限
  • Linux -- 命名管道
  • ansible——ansible的变量
  • Typescript中的Required,Partial,Pick,Omit辅助类型
  • Python爬取站长素材图片【爬虫学习day.01】
  • Android Framework关闭触摸振动
  • Vue笔记-浏览器窗口改变时,重新计算表格高度并设置
  • 【OpenCV】人脸识别方法
  • 32.第二阶段x86游戏实战2-遍历技能2(技能二叉树基址)