结合memo简述useCallback的使用场景

news2024/11/27 8:40:26

先看一下官方对于useCallback的定义:

useCallback是一个允许你在多次渲染中缓存函数的React Hook

这句话包含了俩个因素:

  • useCallback的作用:缓存函数
  • useCallback的使用场景:多次渲染下

什么叫多次渲染呢?组件嵌套的时候会存在多次渲染,如下:

import React, { useState, useCallback, memo} from 'react';


const Child = (props) => {
    console.log('子组件渲染了')
    const {childCount} = props;
    return (
        <div>
            <h1>子组件:{childCount}</h1>
        </div>
    )
}

const Parent = () => {
    console.log('父组件渲染了')
    const [count, setCount] = useState(0);
    const [childCount, setChildCOunt] = useState(0)
    return (
        <div>
            <h1>父组件:{count}</h1>
            <button onClick={()=>{setCount(count+1)}}>点击父组件值加一</button>
            <Child childCount={childCount}/>
        </div>
    )
}
export default Parent;

在这里插入图片描述

通过这个例子,我们能看到,当父组件中的state发生变化的时候,子组件也会触发渲染,即使变化的state并没有作为props传入子组件

如何解决这个问题呢?React.memo登场,只需要将Child用memo包裹,如下:

const Child = memo((props) => {
    console.log('子组件渲染了')
    const {childCount} = props;
    return (
        <div>
            <h1>子组件:{childCount}</h1>
        </div>
    )
})

memo 允许你的组件在 props 没有改变的情况下跳过重新渲染(注意默认是浅比较)
但是如果传入子组件的props中包含了一个函数的话,会发生什么事呢?

import React, { useState, useCallback, memo} from 'react';


const Child = memo((props) => {
    console.log('子组件渲染了')
    const {childCount,watchChildCount} = props;
    //执行传入的watchChildCount
    watchChildCount()

    return (
        <div>
            <h1>子组件:{childCount}</h1>
        </div>
    )
})

const Parent = () => {
    console.log('父组件渲染了')
    const [count, setCount] = useState(0);
    const [childCount, setChildCount] = useState(0)

    //给子组件传入一个函数
    const watchChildCount = () => {
        console.log(childCount,'打印childCount')
    }
    return (
        <div>
            <h1>父组件:{count}</h1>
            <button onClick={()=>{setCount(count+1)}}>点击父组件值加一</button>
            <Child childCount={childCount} watchChildCount={watchChildCount}/>
            <button onClick={() => {setChildCount(childCount+1)}}>点击子组件值加一</button>
        </div>
    )
}
export default Parent;

此时你再点击 父组件值加一 的这个按钮,会发现,即使子组件已经被memo包裹了,子组件还是触发了渲染

这是因为,组件每次渲染的时候,其中的函数都会被重新创建,React.memo使用的是浅比较,所以看似作为props的fn没有发生变化,其实它已经是一个新的fn了

如何解决这个问题呢?useCallback登场

const watchChildCount = useCallback(() => {
    console.log(childCount,'打印childCount')
},[childCount])

useCallback能够将函数缓存起来,只依赖于给定的状态值来确定该函数是否需要重新创建,避免父组件每次更新都创建的这种情况

以上代码都是即粘即用的,感兴趣的可以自己cra一个react项目,去试一下

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

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

相关文章

MySQL命令行输入密码后闪退解决方案

使用MySQL8.0的Command&#xff0c;输入密码后闪退&#xff0c;但是如果不输入密码直接回车&#xff0c;却能直接进入MySQL环境&#xff1b;另外&#xff0c;在IDEA中也无法通过密码连接到root。在网上有如下常见的解决方案&#xff1a;(1)移动my.ini、(2)启动MySQL服务等。但是…

物联网实训室解决方案2024

一、概述 随着5G技术的广泛应用和产业经济的革新升级&#xff0c;物联网产业展现了无比广阔的未来发展潜力&#xff0c;因此对具备创新型技术技能人才的需求也日益迫切。本方案以物联网技术的最新发展为基础&#xff0c;紧密结合当前高职院校物联网实训室建设的实际情况&#…

【读点论文】Open-Set Text Recognition via Character-Context Decoupling

Open-Set Text Recognition via Character-Context Decoupling Abstract 开放集文本识别任务是一个新兴的挑战&#xff0c;在评估过程中需要额外的识别新字符的能力。我们认为&#xff0c;当前方法性能有限的一个主要原因是上下文信息对单个字符视觉信息的混淆效应。在开放集…

有趣的CSS - 新拟态输入框

我是 Just&#xff0c;这里是「设计师工作日常」&#xff0c;《有趣的css》系列已更新 11 篇了&#xff0c;今天这篇是关于新拟态风格的一个输入框效果&#xff0c;希望你们喜欢。 目录 页面效果核心代码html代码css代码 完整代码html页面css样式 页面效果 此效果使用 css 中 b…

standalone安装部署

standalone是spark的资源调度服务&#xff1b;作用和yarn是一样的&#xff1b;standlone运行时的服务&#xff1a; master服务&#xff1b;主服务&#xff1b;管理整个资源调度&#xff1b;资源的申请需要通过master进行分配&#xff1b;类似于yarn里的ResourceManager;&#x…

【ARMv8M Cortex-M33 系列 8 -- RT-Thread 堆内存 检查命令 free 实现及介绍】

文章目录 RT-Thread 堆内存 检查命令 free 实现及介绍rt_memory_info 函数验证 RT-Thread 堆内存 检查命令 free 实现及介绍 在RT-Thread系统中&#xff0c;通常可以通过rt_memory_info函数获取当前的堆内存使用信息&#xff0c;然后你可以包装这个函数来显示剩余的堆空间。rt…

【C++】中类的6个默认成员函数 取地址及const成员函数 学习运算符重载 【实现一个日期类】

文章目录 一、【C】赋值运算符重载1.1 运算符重载【引入】1.2 运算符重载1.3 赋值运算符重载1.4 赋值 二、日期类的实现2.1 判断小于2.2 判断等于2.3 判断小于等于2.4 判断大于2.5 判断大于等于2.6 判断不等于2.7 日期加等天数2.8 获取月份天数2.9 日期加天数2.9.1 日期减等天数…

UE蓝图 Cast节点和源码

系列文章目录 UE蓝图 Cast节点和源码 文章目录 系列文章目录Cast节点功能一、Cast节点用法二、Cast节点使用场景三、Cast节点实现步骤四、Cast节点源码 Cast节点功能 在Unreal Engine&#xff08;UE&#xff09;中&#xff0c;Cast节点是一种蓝图系统中的节点&#xff0c;用于…

重磅!2024年中科院预警期刊名单发布,24本上榜!预警原因公开

2024年中科院预警期刊名单 2月19日&#xff0c;2024年中科院预警期刊名单正式发布&#xff01; 名单分析&#xff1a; 2024年版本的《国际期刊预警名单&#xff08;试行&#xff09;》共24本期刊&#xff0c;较2023年版本的28本减少了4本&#xff0c;今年的24本期刊中&#…

AI专题:AI浪潮,海外日新月异,国内奋力追赶

今天分享的是AI系列深度研究报告&#xff1a;《AI专题&#xff1a;AI浪潮&#xff0c;海外日新月异&#xff0c;国内奋力追赶》。 &#xff08;报告出品方&#xff1a;方正证券&#xff09; 报告共计&#xff1a;24页 来源&#xff1a;人工智能学派 智算三方面奠基生产力革…

推荐12个超级哇塞的工具

今天分享 12 个完全免费的软件工具&#xff0c;包括 5 个电脑软件和 7 个在线工具&#xff0c;每一个都是自己用心挑选&#xff0c;每一个都是良心免费&#xff0c;让你惊艳。 1 WinFR界面版 WinFR界面版是一款基于微软官方命令行工具 Windows File Recovery 的图形界面工具…

网络原理 - HTTP/HTTPS(2)

HTTP请求 认识URL URL基本格式 平时我们俗称的"网址"其实就是说的URL(Uniform Resource Locator统一资源定位符). (还有一个唯一资源标识符,称为uri,严格来说,uri范围比url广). 互联网上的每一个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该…

【Java】文件类 和 I/O流详解

文章目录 一. 文件概述二. 文件类File1. 构造方法和常用普通方法2. 4种获取路径方法的比较 三. I/O流1. 流的概念2. FileReader和FileWriter3. FileInputStream和FileOutputStream4. 带有缓冲功能的I/O流&#xff08;处理流&#xff09;关闭流资源的另一种方法&#xff08;推荐…

three.js 3D可视化地图

threejs地图 可视化地图——three.js实现 this.provinceInfo document.getElementById(provinceInfo); // 渲染器 this.renderer new THREE.WebGLRenderer({antialias: true }); this.renderer.setSize(window.innerWidth, window.innerHeight); this.container.appendChild…

应如何看待用AI写论文一事? AI写论文有助科研还是助长作弊?

自大语言模型问世后&#xff0c;许多高校学生都在悄悄利用ChatGPT等AI&#xff08;人工智能&#xff09;写作软件代写论文&#xff0c;或者用AI辅助论文写作&#xff0c;如罗列提纲、润色语言、降低重复率等。 国内类似ChatGPT的AI写作软件并不少见。在各大等网站上&#xff0…

如何构建企业专属GPT

大语言模型&#xff08;LLM&#xff09;具有令人印象深刻的自然语言理解和生成能力&#xff0c; 2022年11月底OpenAI发布了ChatGPT&#xff0c;一跃成为人工智能AI领域的现象级应用。但由于LLM的训练数据集主要来源于互联网数据&#xff0c;企业私域信息并未被LLM所训练&#x…

品牌如何写出与用户同频的文案?媒介盒子告诉你

文案作为直面消费者的第一前线&#xff0c;承担了品牌与受众的沟通角色。文案运用同频去讲故事&#xff0c;能够更好地与用户产生共鸣。讲好品牌故事能提高用户对品牌的忠诚度&#xff1b;讲好用户故事能够增强用户的信赖感&#xff0c;那么如何写出同频文案呢&#xff1f;接下…

新零售模式太好用了!怎么做的?教你现学现用

随着科技的不断发展&#xff0c;零售行业也在经历着翻天覆地的变革。新零售模式的兴起为传统零售带来了全新的机遇与挑战。 在这个数字化时代&#xff0c;自动售货机作为新零售的一种创新形式&#xff0c;正逐渐改变着消费者购物的方式。 客户案例 智能零售超市 在城市繁华的…

七部门重磅发文!未来产业创新该如何发展?

1 月 29 日&#xff0c;工业和信息化部、教育部、科学技术部、交通运输部、文化和旅游部、国务院国有资产监督管理委员会、中国科学院等七部门联合发布《关于推动未来产业创新发展的实施意见》&#xff08;以下简称《实施意见》&#xff09;&#xff0c;前瞻布局未来产业。未来…

安防监控平台EasyCVR升级之后添加通道进行播放,提示“请确认播放协议配置选项”是什么原因?

智慧安防平台EasyCVR能在复杂的网络环境中&#xff08;专网、局域网、广域网、VPN、公网等&#xff09;将前端海量的设备进行统一集中接入与视频汇聚管理&#xff0c;平台可支持的接入协议包括&#xff1a;国标GB28181、RTSP/Onvif、RTMP&#xff0c;以及厂家的私有协议与SDK&a…