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

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

实现效果

  • 代码逻辑

ReportList.js

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

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

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

js 复制代码
import { memo } from "react";

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

这样,我们就实现了效果。

相关推荐
前端Hardy16 分钟前
pnpm 11.0 正式登场:安装起飞、安全拉满、彻底告别 npm 依赖
前端
PILIPALAPENG16 分钟前
第4周 Day 1:智能体记忆系统——给 Agent 一个"大脑"
前端·人工智能·python
_风满楼22 分钟前
TDD实战-会议室冲突检测的红绿重构循环
前端·javascript·算法
Rkgua27 分钟前
JS中的惰性函数基本介绍
前端·javascript
客场消音器43 分钟前
我用两周半 Vibe Coding 做了一个前额叶训练的微信小程序
前端·javascript·后端
铁皮饭盒2 小时前
成为AI全栈 - 第4课:Drizzle ORM SQLite Elysia 数据库实战
前端·后端
ascarl20102 小时前
Linux.do 帖子整理:AI 调用 Chrome DevTools 调试前端页面
linux·前端·人工智能
DanCheOo2 小时前
开源 | 我是怎么用 ai-memory 让 Cursor 每次开新对话都自动知道项目背景的
前端·人工智能·ai·ai编程
MPGWJPMTJT2 小时前
告别手动切换 Node 版本:从 nvm 迁移到 Volta
前端
Apifox2 小时前
Apifox 近期更新|AI Agent Debugger、A2A Debugger、Postman API 导入、Ask AI 侧边栏对话
前端·人工智能·后端