【前端】【React】useCallback的作用与使用场景总结

一、useCallback 的作用与使用场景总结

  • useCallback 是 React 提供的一个 Hook,用于缓存函数的引用,避免因为组件重新渲染而导致函数地址发生变化。
  • 它返回一个记忆(memoized)后的回调函数,只有当依赖项发生变化时才会重新生成该函数。

二、具体讲解与使用场景

(一)作用详解

  • (1) 避免函数在每次渲染时都重新创建
    • React 函数组件每次渲染都会重新定义所有函数,可能会导致不必要的渲染或性能浪费。
  • (2) 与子组件配合 React.memo 使用,避免子组件不必要的渲染
    • 如果 props 中有一个函数,每次渲染都会创建新函数引用,即使函数体一样,也会导致子组件更新。

(二)使用场景

  • (1) 传递函数给使用 React.memo 的子组件时,避免子组件重复渲染。
  • (2) 用于依赖函数的 useEffectuseMemo,如果不缓存函数会导致无限循环或性能问题。
  • (3) 用于性能优化较敏感的场景,避免重复创建函数。

三、代码示例

(一)未使用 useCallback 导致子组件重复渲染

import React, { useState } from 'react';const Child = React.memo(({ onClick }) => {console.log("Child Rendered");return <button onClick={onClick}>Click Me</button>;
});const Parent = () => {const [count, setCount] = useState(0);const handleClick = () => {console.log("Clicked");};return (<div><p>Count: {count}</p><button onClick={() => setCount(count + 1)}>Add</button><Child onClick={handleClick} /></div>);
};
  • 每次点击“Add”,Parent 组件会重新渲染,handleClick 是新函数,导致 Child 被重新渲染。

(二)使用 useCallback 缓存函数,优化渲染

import React, { useState, useCallback } from 'react';const Child = React.memo(({ onClick }) => {console.log("Child Rendered");return <button onClick={onClick}>Click Me</button>;
});const Parent = () => {const [count, setCount] = useState(0);const handleClick = useCallback(() => {console.log("Clicked");}, []);  // 空数组表示 handleClick 永远不会变return (<div><p>Count: {count}</p><button onClick={() => setCount(count + 1)}>Add</button><Child onClick={handleClick} /></div>);
};
  • 此时点击“Add”不会触发 Child 重新渲染,提升性能。

四、小结

  • useCallback(fn, deps) 等价于 useMemo(() => fn, deps)
  • 用于性能优化,不是所有场景都需要用
  • 优先考虑组件中是否存在性能瓶颈,再考虑是否引入 useCallback

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/75282.shtml

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

相关文章

蓝桥杯备赛学习笔记:高频考点与真题预测(C++/Java/python版)

2025蓝桥杯备赛学习笔记 ——高频考点与真题预测 一、考察趋势分析 通过对第13-15届蓝桥杯真题的分析&#xff0c;可以发现题目主要围绕基础算法、数据结构、数学问题、字符串处理、编程语言基础展开&#xff0c;且近年逐渐增加动态规划、图论、贪心算法等较难题目。 1. 基…

20250410在荣品的PRO-RK3566开发板使用Rockchip原厂的buildroot系统时自动挂载eth0【直接编译进IMG】

【暂时没有找到第一次编译就可以修改的地方&#xff01;&#xff01;&#xff01;&#xff01;】 rootrootrootroot-X99-Turbo:~/RK3566_RK3568_Linux5.10_V1.2.0$ find . -name interfaces 【完整编译之后&#xff0c;基本确认修改这里有效。】 ./buildroot/output/rockchip_r…

c11新特性,继承构造函数

#include <iostream> #include <string>class Person { public:std::string name;int age;// 主构造函数Person(const std::string& name, int age) : name(name), age(age) {std::cout << "Person created with name: " << name <&l…

【TS学习】(24)什么是装饰器

在 TypeScript 中&#xff0c;装饰器&#xff08;Decorators&#xff09; 是一种特殊的声明&#xff0c;用于为类、类成员&#xff08;属性、方法、访问器&#xff09;、方法参数或整个类添加元数据或修改其行为。装饰器是 JavaScript 和 TypeScript 的实验性特性&#xff0c;广…

datagrip如何连接数据库

datagrip连接数据库的步骤 2025版本 想要链接数据库是需要一个jar包的&#xff0c;所以将上面进行删除之后&#xff0c;需要下载一个jar包 那么这个时候需要链接上传一个mysql链接的jar包 选择核心驱动类 上述操作完成之后&#xff0c;然后点击apply再点击ok即可 如下图说明my…

菊风RTC 2.0 开发者文档正式发布,解锁音视频新体验!

重磅发布&#xff01; 开发者们&#xff0c;菊风实时音视频2.0文档已正式发布上线&#xff0c;为您提供更清晰、更高效的开发支持&#xff01;让菊风实时音视频2.0为您的音视频应用加速~ 菊风实时音视频2.0聚焦性能升级、体验升级、录制服务升级&#xff0c;助力视频通话、语…

轻量级碎片化笔记memos本地NAS部署与跨平台跨网络同步笔记实战

文章目录 前言1. 使用Docker部署memos2. 注册账号与简单操作演示3. 安装cpolar内网穿透4. 创建公网地址5. 创建固定公网地址 推荐 ​ 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。 点击跳转到网站 前言…

【Vue #2】脚手架 指令

一、脚手架 脚手架&#xff1a;一个保证各项工作顺利开展的平台&#xff0c;方便我们 拿来就用&#xff0c;零配置 1. Vue 代码开发方式 相比直接 script 引入 vue 源码&#xff0c;有没有更好的方式编写vue代码呢? ① 传统开发模式&#xff1a; 基于html文件开发Vue&…

ArkTS语言入门之接口、泛型、空安全、特殊运算符等

前言 臭宝们&#xff0c;今天我们来学习ArkTS中最后的一些内容。 实现接口 包含implements子句的类必须实现列出的接口中定义的所有方法&#xff0c;但使用默认实现定义的方法除外。 interface DateInterface {now(): string; } class MyDate implements DateInterface {no…

Maven超级详细安装部署

1.到底什么是Maven&#xff1f;搞清楚这个 Maven 是一个项目管理工具&#xff0c;主要用于 Java 项目的构建、依赖管理和文档生成。 它基于项目对象模型&#xff08;POM&#xff09;&#xff0c;通过 pom.xml 文件定义项目的配置。 &#xff08;简单说破&#xff1a;就是工程…

高并发内存池(三):PageCache(页缓存)的实现

前言&#xff1a; 在前两期内容中&#xff0c;我们深入探讨了内存管理机制中在 ThreadCache 和 CentralCache两个层级进行内存申请的具体实现。这两层缓存作为高效的内存分配策略&#xff0c;能够快速响应线程的内存需求&#xff0c;减少锁竞争&#xff0c;提升程序性能。 本期…

机器学习 | 强化学习方法分类汇总 | 概念向

文章目录 📚Model-Free RL vs Model-Based RL🐇核心定义🐇核心区别📚Policy-Based RL vs Value-Based RL🐇核心定义🐇 核心区别📚Monte-Carlo update vs Temporal-Difference update🐇核心定义🐇核心区别📚On-Policy vs Off-Policy🐇核心定义🐇核心区别…

GSO-YOLO:基于全局稳定性优化的建筑工地目标检测算法解析

论文地址:https://arxiv.org/pdf/2407.00906 1. 论文概述 《GSO-YOLO: Global Stability Optimization YOLO for Construction Site Detection》提出了一种针对建筑工地复杂场景优化的目标检测模型。通过融合全局优化模块(GOM)​、稳定捕捉模块(SCM)​和创新的AIoU损失函…

Java学习手册:JVM、JRE和JDK的关系

在Java生态系统中&#xff0c;JVM&#xff08;Java虚拟机&#xff09;、JRE&#xff08;Java运行时环境&#xff09;和JDK&#xff08;Java开发工具包&#xff09;是三个核心概念。它们共同构成了Java语言运行和开发的基础。理解它们之间的关系对于Java开发者来说至关重要。本文…

lanqiaoOJ 2489 进制

//x的初始值一定要设置为0,否则测试的答案是对的,但是通不过去 #include<bits/stdc.h> using namespace std; const int N50; int a[N]; using lllong long; int main(){ ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); string s"2021ABCD"; for(int i…

Python基础知识点(类和对象)

""" 编程思维---解决问题的方式方法 面向过程---C语言 面向对象---C java python python中封装类的语法 class 类名&#xff08;父类&#xff09; 类体 注意&#xff1a; 1.类名--约定 大驼峰法 首字母要大写 2.父类如果有的话就写&#xff0c;没有的话…

记录一下学习docker的命令(不断补充中)

#2025-04-10,22:12############### 在wsl2中安装了ubuntu24.04.1后有部署了docker&#xff0c; 如果没有启动docker可以通过下列命令启动docker&#xff1a; sudo systemctl start docker 执行下列命令可以看到docker状态&#xff0c;并不占用控制台的命令&#xff1a; su…

【01BFS】# P4667 [BalticOI 2011] Switch the Lamp On 电路维修 (Day1)|普及+

本文涉及知识点 CBFS算法 题目描述 Casper is designing an electronic circuit on a N M N \times M NM rectangular grid plate. There are N M N \times M NM square tiles that are aligned to the grid on the plate. Two (out of four) opposite corners of each …

参考平面跨分割情况下的信号回流

前言&#xff1a;弄清楚信号的回流路径&#xff0c;是学习EMC和高速的第一步&#xff01; 如果我们不管信号的回流路径&#xff0c;会造成什么后果&#xff1f;1、信号完整性问题&#xff0c;信号的回流路径不连续会导致信号反射、衰减和失真。2、信号衰减和噪声干扰&#xff…

almalinux 8 9 升级到指定版本

almalinux 8 update 指定版本 almalinux历史版 所有版本almalinux最新版 所有版本vault历史版 almalinux最新版 (https://repo.almalinux.org )地址后面增加不同名称 echo "delete repos" rm -rf /etc/yum.repos.d/*echo "new almalinux repo" cat <&…