React 第十六节 useCallback 使用详解注意事项

useCallback 概述

1、useCallback 是在React 中多次渲染缓存函数的 Hook,返回一个函数的 memoized的值;
2、如果多次传入的依赖项不变,那么多次定义的时候,返回的值是相同的,防止频繁触发更新;
3、多应用在 父组件为函数式组件,子组件也为函数式组件,并且子组件被 React.memo() 包裹着;
4、主要用于性能优化,即使不适用useCallback,代码也要能正常运行;

useCallback 基本用法

写法

let memoizedCallback = useCallback(fn, dependencies)

第一个参数fn 是想要缓存的函数,可以接收任何参数并返回任何值;React 中会在初始化时候调用,而不是渲染时候调用;
当执行下一次渲染时候,如何出入的依赖值 dependencies 相同,则会返回相同的函数 memoizedCallback
相反 若依赖值 dependencies 不同,则会返回新的函数 memoizedCallback,但是 React 不会主动去调用 memoizedCallback函数,需要开发者自己决定什么时候执行调用函数;

第二个参数
dependencies:是否要更新 fn 的所有响应式值的一个列表,可以传入空数组:[]
响应式值包括 props、state,和所有在你组件内部直接声明的变量和函数。

useCallback 示例

1、为什么要使用 useCallback

当我们传入相同值的时候,不管是对象类型,还是基本类型,都不希望子组件进行更新渲染;
在不需要大量渲染的时候,性能还可以,但是当数据量大的时候,若相同的数据也触发子组件渲染,则会出现性能问题;

2、在不使用 useCallback() 的时候

每次触发 handleAdd 事件时候,都会渲染子组件 ChildA

//  父组件
import { useCallback,  useState} from 'react'
import ChildA from './childA'
export default function MyCallBack() {

   const [useInfo, setUseInfo] = useState({
       name: 'Andy',
       age: 18
   })
   const myCallback = () => {
       console.log('==useCallback==')
       return useInfo.name
   }

   const handleAdd = () => {
       setUseInfo({
           name: 'Andy',
           age: 18
       })
   }
 return (
   <div>
     <h3>This is a MyCallBack demo .---{count}</h3>
       <button onClick={handleAdd}>add</button>
        <hr />
       <ChildA  onAddCount={myCallback} ></ChildA>
   </div>
 )
}

// 子组件
import React, { memo } from 'react'

const  ChildA = memo(({onAddCount}) => {
    console.log('==ChildA 组件更新了=', count)
    return (
        <div>
        <h3>This is a ChildA demo .</h3>
            <button onClick={onAddCount}>子组件</button>
            <hr />
        </div>
    )
})

当我们点击 add 按钮时候,发现页面打印 “==ChildA 组件更新了=”,说明传入相同的数据时候,会触发子组件渲染;如图所示

在这里插入图片描述

3、使用 useCallback 时候

import { useCallback,useState} from 'react'
import ChildA from './childA'
export default function MyCallBack() {
  console.log('===父组件callback==')
    const [count, setCount] = useState(0)
    const [useInfo, setUseInfo] = useState({
        name: 'Andy',
        age: 18
    })
    const myCallback = useCallback(() => {
        console.log('==useCallback==')
        return useInfo.name
    }, [useInfo.name])
    const handleAdd = () => {
        setUseInfo({
            name: 'Andy',
            age: 18
        })
    }
  return (
    <div>
      <h3>This is a MyCallBack demo .---{count}</h3>
        <button onClick={handleAdd}>add</button>
         <hr />
        <ChildA  onAddCount={myCallback} ></ChildA>
    </div>
  )
}

// 子组件
import { memo } from 'react'
// eslint-disable-next-line react/display-name
const  ChildA = memo(({useInfo, count, onAddCount}) => {
    console.log('==ChildA 组件更新了=', count)
    const handleChangeName = () =>{
            setName('Tom')
       }
    return (
        <div>
        <h3>This is a ChildA demo .</h3>
            <h4>{count}</h4>
            <h4>姓名:{useInfo?.name || '--'}</h4>
            <h4>年龄:{useInfo?.age || '--'}</h4>
            <button onClick={onAddCount}>子组件</button>
            <hr />
        </div>
    )
})
export default  ChildA 

在点击 add 按钮 更新相同数据时候,只有父组件渲染子组件不会再渲染;如图:在这里插入图片描述

总结

若要实现 传入相同数据时候,只更新当前组件,而子组件不进行渲染,需使用 useCallback() 和 memo 来处理

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【智体OS】官方上新发布智体机器人:使用rtrobot智体应用远程控制平衡车机器人

【智体OS】官方上新发布智体机器人&#xff1a;使用rtrobot智体应用远程控制平衡车机器人 dtns.network是一款主要由JavaScript编写的智体世界引擎&#xff08;内嵌了three.js编辑器的定制版-支持以第一视角浏览3D场馆&#xff09;&#xff0c;可以在浏览器和node.js、deno、e…

Windows系统VSCode 搭建ESP-IDF环境

VS Code&#xff0c;安装ESP-IDF插件 快捷键CTRLSHIFTP&#xff0c;弹出显示所有命令的窗口&#xff0c;选择ESP-IDF的欢迎 使用第一个选项&#xff0c;要选择一个ESP-IDF版本&#xff0c;选最新的就行 点击Install,等待下载 提示安装成功&#xff0c;如果过程中出现python已存…

PR裁剪与删除

剪切 剪切片段 工具面板的第四个工具&#xff0c;剃刀工具&#xff0c;在英文输入法下可以使用快捷键C来切换&#xff0c;或者直接使用CtrlK进行裁剪。 CtrlK&#xff1a;选中剪辑后会在指针处进行裁剪。 剃刀工具&#xff1a;在执行位置剪裁&#xff0c;包括连接在一起的素材…

基于物联网的 AI 智能送药车与自维护基站系统研究

一、引言 &#xff08;一&#xff09;研究背景 随着科技的飞速发展&#xff0c;物联网技术在各个领域都展现出了巨大的潜力。在医疗领域&#xff0c;物联网技术的应用为提高医疗服务的效率和质量带来了新的机遇。其中&#xff0c;基于物联网的 AI 智能送药车与自维护基站系统…

TÜLU 3: Pushing Frontiers inOpen Language Model Post-Training

模型&#xff1a;https://huggingface.co/allenai 技术报告&#xff1a;https://allenai.org/papers/tulu-3-report.pdf 数据集&#xff1a;https://huggingface.co/collections/allenai/tulu-3-datasets-673b8df14442393f7213f372 GitHub&#xff1a;https://github.com/al…

123213124

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &#x1f4e2;本文由 JohnKi 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f4e2;未来很长&#…

软考系分:今日成绩已出

前言 今年报考了11月份的软考高级&#xff1a;系统分析师。 考试时间&#xff1a;11月9日。 总体感觉偏简单&#xff0c;但是知识点记得不牢&#xff0c;估计机会不大。 今日 12.11 &#xff0c;成绩已出&#xff0c;每科总分 75分&#xff0c;全部45分以上为通过。 成绩总…

数据结构10——排序

目录 1.插入排序 1.1 直接插入排序 1.2 希尔排序 2. 选择排序 2.1 直接选择排序 2.2 堆排序 *TopK问题&#xff1a; 3. 交换排序 3.1 冒泡排序 3.2 快速排序 1. Hoare版本 2. 挖坑法 3. 前后指针法 4. 快速排序优化 5. 非递归快速排序 4.归并排序 1.递归式归并…

Envoy 服务发现原理大揭秘与核心要点概述

1 Envoy动态配置介绍 动态资源&#xff0c;是指由envoy通过xDS协议发现所需要的各项配置的机制&#xff0c;相关的配置信息保存 于称之为管理服务器&#xff08;Management Server &#xff09;的主机上&#xff0c;经由xDS API向外暴露&#xff1b;下面是一个 纯动态资源的基…

PYNQ - 自定义含 DPU 的 overlay 层(MPSoC)

目录 1. 简介 2. 通过脚本构建 2.1 准备工作 2.2 通过 Makefile 构建 2.3 Makefile 源码及解析 2.3.1 源码-中文注释 2.3.2 主要功能分析 2.3.3 vivado batch 模式 2.3.4 package_xo 命令 2.3.5 vitis v 命令 2.4 DPU 参数 2.4.1 Arch 选项卡 2.4.2 Advanced 选项…

GPT-SoVITS语音合成模型部署及使用

1、概述 GPT-SoVITS是一款开源的语音合成模型&#xff0c;结合了深度学习和声学技术&#xff0c;能够实现高质量的语音生成。其独特之处在于支持使用参考音频进行零样本语音合成&#xff0c;即使没有直接的训练数据&#xff0c;模型仍能生成相似风格的语音。用户可以通过微调模…

25.DDD数量关系

学习视频来源&#xff1a;DDD独家秘籍视频合集 https://space.bilibili.com/24690212/channel/collectiondetail?sid1940048&ctype0 文章目录 关系型数据库的数量关系领域模型的数量关系实现聚合数量关系聚合内聚合间具体说明代码 数量关系是本质吗&#xff1f;领域对象之…

GB28181系列二:TS、PS格式

我的音视频/流媒体开源项目(github) GB28181系列目录 目录 一、TS、PS简介 二、PES格式 三、TS格式 3.1 固定字段 3.2、调整域(Adaptation field) 3.3、第一个可选域(optional fields) 3.4、第二个可选域(optional fields) 3.5、负载 3.6、PSI 四、PS格式 4.1、PS头…

OpenAI 正式赋予 ChatGPT 通过视频实时与用户互动的能力

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

QT 国际化(翻译)

QT国际化&#xff08;Internationalization&#xff0c;简称I18N&#xff09;是指将一个软件应用程序的界面、文本、日期、数字等元素转化为不同的语言和文化习惯的过程。这使得软件能够在不同的国家和地区使用&#xff0c;并且可以根据用户的语言和地区提供本地化的使用体验。…

【大语言模型】LangChain 核心模块介绍(Chains、Retrieval、Tools)

【大语言模型】LangChain 核心模块 一、LangChain 核心模块 Chains1、简介2、应用场景3、使用技巧3.1、LCEL Chains3.2、Legacy Chains 4、实践演练 二、LangChain 核心模块 Retrieval1、简介2、应用场景2.1、需求说明2.2、实现思路 三、LangChain 核心组件 Tools1、应用场景2、…

webstorm开发uniapp(从安装到项目运行)

1、下载uniapp插件 下载连接&#xff1a;Uniapp Tool - IntelliJ IDEs Plugin | Marketplace &#xff08;结合自己的webstorm版本下载&#xff0c;不然解析不了&#xff09; 将下载到的zip文件防在webstorm安装路径下&#xff0c;本文的地址为&#xff1a; 2、安装uniapp插…

实现 RAM 时应该考虑的性能因素

实现 RAM 时应该考虑的性能因素 要高效地推断存储元件&#xff0c;需要考虑下列影响性能的因素&#xff1a; • 使用专用块还是分布式 RAM RAM 可以在专用块 RAM 或使用分布式 RAM 的 LUT 内实现。不同的选择会影响资源选择&#xff0c;同时还会严重地影响性 能和功耗…

【前端开发】HTML+CSS网页,可以拿来当作业(免费开源)

HTML代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content_lizhongyu"widthdevice-width, initial-scale1.0"><title>小兔鲜儿-新鲜、惠民、快捷<…

TongWe7.0-东方通TongWeb控制台无法访问 排查

**问题描述&#xff1a;**无法访问TongWeb的控制台 逐项排查&#xff1a; 1、控制台访问地址是否正确&#xff1a;http://IP:9060/console #IP是服务器的实际IP地址 2、确认TongWeb进程是否存在&#xff0c;执行命令&#xff1a;ps -ef|grep tongweb 3、确认TongWeb服务启动…