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

useCallback()

官网直达:https://zh-hans.react.dev/reference/react/useCallback

点击按钮,子组件会重新渲染

import { memo, useState, useCallback } from 'react';const Child = (props) => {console.log('我是子组件!我在渲染呢!!!')return (<><div>我是子组件</div></>)
}const Parent = () => {console.log('我是父组件!我在渲染呢!!!')const [p1, setP1] = useState(0)const p2 = 'hello';const p3 = 'world';return (<><div>我是父组件,p1:{p1}</div><button onClick={() => {setP1(p1 + 1);}}>点我p1加1</button><Child p2={p2} p3={p3} /></>)
}export default Parent;

点击父组件的按钮,子组件也跟着渲染

使用memo()包裹子组件,如下

import { memo, useState, useCallback } from 'react';const Child = memo((props) => {console.log('我是子组件!我在渲染呢!!!')return (<><div>我是子组件</div></>)
});const Parent = () => {console.log('我是父组件!我在渲染呢!!!')const [p1, setP1] = useState(0)const p2 = 'hello';const p3 = 'world';return (<><div>我是父组件,p1:{p1}</div><button onClick={() => {setP1(p1 + 1);}}>点我p1加1</button><Child p2={p2} p3={p3} /></>)
}export default Parent;

这样父组件里的state变换就不会再渲染子组件了

使用memo()后会对props进行浅比较,如果props没有变化,则不会重新渲染子组件

现在要给子组建要传入一个函数p4,如下

import { memo, useState, useCallback } from 'react';const Child = memo((props) => {console.log('我是子组件!我在渲染呢!!!')return (<><div>我是子组件</div></>)
});const Parent = () => {console.log('我是父组件!我在渲染呢!!!')const [p1, setP1] = useState(0)const p2 = 'hello';const p3 = 'world';const p4 = () => {console.log(p2, p3)}return (<><div>我是父组件,p1:{p1}</div><button onClick={() => {setP1(p1 + 1);}}>点我p1加1</button><Child p2={p2} p3={p3} p4={p4} /></>)
}export default Parent;

现在添加p4,发现父组件的state变换,子组件也会重新渲染

说明p4变化了

这是因为p4是一个函数,每次渲染都会生成一个新的函数,导致props变化,从而触发子组件重新渲染

所以需要使用useCallback来缓存函数,确保是同一个函数

useCallback接受两个参数,第一个参数是函数,第二个参数是依赖项数组如下

同时在包裹函数的时候要在useCallback里传入函数所依赖的参数,

否则useCallback会认为函数没有依赖项,每次都会生成一个新的函数

import { memo, useState, useCallback } from 'react';const Child = memo((props) => {console.log('我是子组件!我在渲染呢!!!')return (<><div>我是子组件</div></>)
});const Parent = () => {console.log('我是父组件!我在渲染呢!!!')const [p1, setP1] = useState(0)const p2 = 'hello';const p3 = 'world';const p4 = useCallback(() => {console.log(p2, p3)}, [p2, p3])return (<><div>我是父组件,p1:{p1}</div><button onClick={() => {setP1(p1 + 1);}}>点我p1加1</button><Child p2={p2} p3={p3} p4={p4} /></>)
}export default Parent;

哎,这样就可以了,子组建没有重新渲染

来看下回调函数执行完之后会是怎样的一个结果

子组建执行props.p4()

如果回调里面要把p1log出来,会出现什么问题

只有第一次才会输出,p1改变不执行

应为函数p4被缓存了起来

依赖项是p2和p3,p1改变,不会触发p4重新生成

添加依赖项p1,p4重新生成,p1改变,p4重新执行

import { memo, useState, useCallback } from 'react';const Child = memo((props) => {console.log('我是子组件!我在渲染呢!!!')props.p4()return (<><div>我是子组件</div></>)
});const Parent = () => {console.log('我是父组件!我在渲染呢!!!')const [p1, setP1] = useState(0)const p2 = 'hello';const p3 = 'world';const p4 = useCallback(() => {console.log(p2, p3, p1)}, [p2, p3, p1])return (<><div>我是父组件,p1:{p1}</div><button onClick={() => {setP1(p1 + 1);}}>点我p1加1</button><Child p2={p2} p3={p3} p4={p4} /></>)
}export default Parent;

相关文章:

useCallback()

官网直达&#xff1a;https://zh-hans.react.dev/reference/react/useCallback 点击按钮&#xff0c;子组件会重新渲染 import { memo, useState, useCallback } from react;const Child (props) > {console.log(我是子组件&#xff01;我在渲染呢&#xff01;&#xff0…...

Python面试题精选及解析--第二篇

在Python的面试中&#xff0c;除了基础语法和常用库的知识外&#xff0c;面试官往往还会通过一系列的问题来考察应聘者的逻辑思维、问题解决能力以及项目经验。以下是一些精心挑选的Python面试题及其详细答案&#xff0c;旨在帮助求职者更好地准备面试。 面试题一&#xff1a;…...

Linux操作常用问题

目录 Ubuntu操作问题vi编辑方向键键盘乱码回退键不能使用的问题解决问题的方法 Ubuntu操作问题 vi编辑方向键键盘乱码回退键不能使用的问题 编辑/etc/systemd/resolved.conf文件来修改DNS&#xff0c;结果编辑时键盘乱码&#xff0c;按下方向键会出现ABCD&#xff0c;且回退键…...

汽车发动机系统(ems)详细解析

汽车发动机系统EMS&#xff0c;即Engine-Management-System&#xff08;发动机管理系统&#xff09;&#xff0c;是现代汽车电子控制技术的重要组成部分。以下是对汽车发动机系统EMS的详细解析&#xff0c;内容将涵盖其定义、工作原理、主要组成、功能特点、技术发展以及市场应…...

对比学习训练是如何进行的

对比学习&#xff08;Contrastive Learning&#xff09;是一种自监督学习的方法&#xff0c;旨在通过拉近相似样本的表示、拉远不相似样本的表示来学习特征表示。在训练过程中&#xff0c;模型并不依赖标签&#xff0c;而是通过样本之间的相似性进行学习。以下是对比学习的基本…...

React 生命周期 - useEffect 介绍

在 React 中&#xff0c;useEffect 钩子可以被看作是函数组件中的一种副作用管理工具&#xff0c;它的行为可以模拟类组件中的不同生命周期方法。useEffect 的执行时机取决于其依赖项数组&#xff08;第二个参数&#xff09;的设置方式。 根据 useEffect 的使用方式&#xff0c…...

OpenCV-指纹识别

文章目录 一、意义二、代码实现1.计算匹配点2.获取编号3.获取姓名4.主函数 三、总结 一、意义 使用OpenCV进行指纹识别是一个复杂且挑战性的任务&#xff0c;因为指纹识别通常需要高精度的特征提取和匹配算法。虽然OpenCV提供了多种图像处理和计算机视觉的工具&#xff0c;但直…...

IPD的核心思想

IPD是一套领先的、成熟的研发管理思想、模式和方法。它是根据大量成功的研发管理实践总结出来的&#xff0c;并被大量实践证明的高效的产品研发模式。 那么&#xff0c;按照IPD来开展产品研发与产品管理工作&#xff0c;应该基于哪些基本思想或原则&#xff1f;市场导向、客户…...

如何在算家云搭建MVSEP-MDX23(音频分离)

一、MVSEP-MDX23简介 模型GitHub网址&#xff1a;MVSEP-MDX23-music-separation-model/README.md 在 main ZFTurbo/MVSEP-MDX23-音乐分离模型 GitHub 上 在音视频领域&#xff0c;把已经发布的混音歌曲或者音频文件逆向分离一直是世界性的课题。音波混合的物理特性导致在没有…...

常用的Java安全框架

Spring Security&#xff1a; 就像Java安全领域的“瑞士军刀”&#xff0c;功能全面且强大。 支持认证、授权、加密、会话管理等安全功能。 与Spring框架无缝集成&#xff0c;使用起来特别方便。 社区活跃&#xff0c;文档丰富&#xff0c;遇到问题容易找到解决方案。 Apach…...

使用 PHP 的 strip_tags函数保护您的应用安全

在现代 web 开发中&#xff0c;处理用户输入是一项常见的任务。然而&#xff0c;用户输入的内容往往包含 HTML 或 PHP 标签&#xff0c;这可能会导致安全漏洞&#xff0c;如跨站脚本攻击&#xff08;XSS&#xff09;。为了解决这个问题&#xff0c;PHP 提供了一个非常有用的函数…...

您的计算机已被Lockbit3.0勒索病毒感染?恢复您的数据的方法在这里!

导言 在数字化时代&#xff0c;互联网已成为我们生活、工作和学习中不可或缺的一部分。然而&#xff0c;随着网络技术的飞速发展&#xff0c;网络安全威胁也日益严峻。其中&#xff0c;勒索病毒作为一种极具破坏性的网络攻击手段&#xff0c;正逐渐成为企业和个人面临的重大挑…...

经典sql题(十二)UDTF之Explode炸裂函数

1. EXPLODE: UDTF 函数 1.1 功能说明 EXPLODE 函数 是Hive 中的一种用户定义的表函数&#xff08;UDTF&#xff09;&#xff0c;用于将数组或映射结构中的复杂的数据结构每个元素拆分为单独的行。这在处理复杂数据时非常有用&#xff0c;尤其是在需要将嵌套数据“打散”以便更…...

【AIGC】ChatGPT提示词解析:如何打造个人IP、CSDN爆款技术文案与高效教案设计

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;打造个人IP爆款文案提示词使用方法 &#x1f4af;CSDN爆款技术文案提示词使用方法 &#x1f4af;高效教案设计提示词使用方法 &#x1f4af;小结 &#x1f4af;前言 在这…...

【Ubuntu】Ubuntu常用命令

文章目录 网卡路由常用命令&#xff1a;编辑文件echo 权限设置gcc编译器&#xff1a; 重启网络服务 sudo service network-manager restart 网卡 #查看网卡信息 ip a #区分光网卡电网卡 sudo lshw -class network -businfo ifconfig ifconfig eth1 192.168.1.12/24 #重启网卡…...

架构设计笔记-5-软件工程基础知识-2

知识要点 构件组装是将库中的构件经适当修改后相互连接,或者将它们与当前开发项目中的软件元素连接,最终构成新的目标软件。 构件组装技术大体可分为: 1. 基于功能的组装技术:基于功能的组装技术采用子程序调用和参数传递的方式将构件组装起来。它要求库中的构件以子程序…...

[网络]抓包工具介绍 tcpdump

一、tcpdump tcpdump是一款基于命令行的网络抓包工具&#xff0c;可以捕获并分析传输到和从网络接口流入和流出的数据包。 1.1 安装 tcpdump 通常已经预装在大多数 Linux 发行版中。如果没有安装&#xff0c;可以使用包管理器 进行安装。例如 Ubuntu&#xff0c;可以使用以下…...

基于STM32和FPGA的射频数据采集系统设计流程

一、项目概述 高速采集射频&#xff08;RF&#xff09;信号是一个关键的需求。本文旨在设计一种基于STM32和FPGA的射频数据采集系统&#xff0c;以实现对接收到的射频信号的高精度和高速度的处理。该系统适用于无线通信、信号分析、雷达系统等应用场景。 技术栈关键词&#x…...

自动变速箱系统(A/T)详细解析

自动变速箱系统&#xff08;A/T&#xff09;&#xff0c;即Automatic Transmission&#xff0c;是一种能够在车辆行驶过程中自动完成换挡操作的传动系统。以下是对自动变速箱系统&#xff08;A/T&#xff09;的详细解析&#xff0c;内容涵盖其定义、工作原理、主要组成、类型、…...

【Kubernetes】常见面试题汇总(四十三)

目录 98. kube-apiserver 和 kube-scheduler 的作用是什么&#xff1f; 99.您对云控制器管理器了解多少&#xff1f; 特别说明&#xff1a; 题目 1-68 属于【Kubernetes】的常规概念题&#xff0c;即 “ 汇总&#xff08;一&#xff09;~&#xff08;二十二&#xff09;…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者&#xff1a;来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗&#xff1f;了解下一期 Elasticsearch Engineer 培训的时间吧&#xff01; Elasticsearch 拥有众多新功能&#xff0c;助你为自己…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

基于matlab策略迭代和值迭代法的动态规划

经典的基于策略迭代和值迭代法的动态规划matlab代码&#xff0c;实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...

虚拟电厂发展三大趋势:市场化、技术主导、车网互联

市场化&#xff1a;从政策驱动到多元盈利 政策全面赋能 2025年4月&#xff0c;国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》&#xff0c;首次明确虚拟电厂为“独立市场主体”&#xff0c;提出硬性目标&#xff1a;2027年全国调节能力≥2000万千瓦&#xff0…...

【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制

目录 节点的功能承载层&#xff08;GATT/Adv&#xff09;局限性&#xff1a; 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能&#xff0c;如 Configuration …...

嵌入式常见 CPU 架构

架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集&#xff0c;单周期执行&#xff1b;低功耗、CIP 独立外设&#xff1b;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel&#xff08;原始…...

vue3 daterange正则踩坑

<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…...

阿里云Ubuntu 22.04 64位搭建Flask流程(亲测)

cd /home 进入home盘 安装虚拟环境&#xff1a; 1、安装virtualenv pip install virtualenv 2.创建新的虚拟环境&#xff1a; virtualenv myenv 3、激活虚拟环境&#xff08;激活环境可以在当前环境下安装包&#xff09; source myenv/bin/activate 此时&#xff0c;终端…...

【多线程初阶】单例模式 指令重排序问题

文章目录 1.单例模式1)饿汉模式2)懒汉模式①.单线程版本②.多线程版本 2.分析单例模式里的线程安全问题1)饿汉模式2)懒汉模式懒汉模式是如何出现线程安全问题的 3.解决问题进一步优化加锁导致的执行效率优化预防内存可见性问题 4.解决指令重排序问题 1.单例模式 单例模式确保某…...