useCallback使用注意

news2025/1/13 15:54:12

背景

useCallback的作用时基于依赖项缓存函数,但是这个缓存时取值缓存而不是按照地址缓存,这导致了如果缓存的函数使用的值依赖外部某个变量,这个变量只会取第一次用到的值

例子

具体可以看https://codesandbox.io/s/misty-night-vds9oo?file=/demo.js

import "@arco-design/web-react/dist/css/arco.css";
import { useState, useCallback } from "react";
import { useMemoizedFn } from "ahooks";

function Demo(props) {
  const getValue = useCallback(() => {
    return props.test;
  }, []);
  return <div>{getValue()}</div>;
}
function Demo2(props) {
  const getValue = () => {
    return props.test;
  };
  return <div>{getValue()}</div>;
}
function Demo3(props) {
  const getValue = useMemoizedFn(() => {
    return props.test;
  }, []);
  return <div>{getValue?.()}</div>;
}

function App() {
  const [test, setTest] = useState("1");
  return (
    <div>
      无缓存的
      <Demo2 test={test} />
      有缓存但有问题的
      <Demo test={test} />
      有缓存且符合预期
      <Demo3 test={test} />
      <button
        onClick={() => {
          setTest(Math.random());
        }}
      >
        点击更改test值
      </button>
    </div>
  );
}

export default App;

demo

解决办法

使用https://ahooks.js.org/zh-CN/hooks/use-memoized-fn/替代useCallback

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

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

相关文章

JavaScript:箭头函数与普通函数的区别与适用场景

文章目录 1 箭头函数与普通函数的区别1.1 语法上的区别1.2 this指向的区别1.3 arguments对象的区别1.4 箭头函数不能用作构造函数 2 箭头函数和普通函数的适用场景2.1 普通函数的适用场景2.1.1 构造函数2.1.2 方法2.1.3 回调函数 2.2 箭头函数的适用场景2.2.1 简答的回调函数2.…

IIS配置URL重写,http重定向https

文章目录 1️⃣ URL重写1.1 URL重写插件下载1.2 URL重写插件安装1.3 URL重写插件配置 优质资源分享 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/131004077 IIS配置URL重写&#xff0c;http重定向https&#xff0c;ht…

【计算机图形学】【代码复现】A-SDF中的数据集制作与数据生成

Follow A-SDF 的Data Generation部分&#xff1a; We follow (1) ANSCH to create URDF for shape2motion dataset (1-2) URDF2OBJ&#xff08;本人认为是1-2之间需要进行的重要的过渡部分&#xff09; (2) Manifold to create watertight meshes (3) and modified mesh_to_sdf…

CPLEX Studio 集成开发环境 (IDE) 介绍

CPLEX Studio 集成开发环境 (IDE) 介绍 参考B站视频&#xff1a;cplex入门到精通 1.CPLEX Studio IDE 实现的功能 IBM ILOG CPLEX Studio IDE 是一个用于数学规划、约束规划以及一般组合优化应用程序的集成开发环境。 它是适用于 OPL&#xff08;优化编程语言&#xff09;和…

PointNetGPD使用手册

1.创建环境配置环境变量 mkdir -p $HOME/code/ cd $HOME/code/ - Set environment variable PointNetGPD_FOLDER in your $HOME/.bashrc file. export PointNetGPD_FOLDER$HOME/code/PointNetGPD 2.安装 1. Install pcl-tools via sudo apt install pcl-tools. 2. An e…

在家当了几年废物,庆幸自己当初进了软件测试这行~

为什么会学习软件测试&#xff1f; 28岁了&#xff0c;仔细算一下6年了&#xff0c;工作了一年&#xff0c;没去工作就一直待在家&#xff0c;家里固定每个月给几千元&#xff0c;偶尔会都给一些&#xff0c;但依旧没钱&#xff0c;家里给我买了一套房子&#xff0c;出门300米…

【刷题之路Ⅱ】LeetCode 739. 每日温度

【刷题之路Ⅱ】LeetCode 739. 每日温度 一、题目描述二、解题1、方法1——暴力法1.1、思路分析1.2、代码实现 2、方法2——单调栈2.1、思路分析2.2、先将栈实现一下2.3、代码实现 一、题目描述 原题连接&#xff1a; 739. 每日温度 题目描述&#xff1a; 给定一个整数数组 tem…

ChatGPT 使用 拓展资料:吴恩达大咖 基于LangChain的LLM应用程序开发-1

ChatGPT 使用 拓展资料:吴恩达大咖 基于LangChain的LLM应用程序开发 基于LangChain的LLM应用程序开发 LangChain for LLM Application Development [https://www.deeplearning.ai/short-courses/langchain-for-llm-application-development/] 基于LangChain的LLM应用程序开发…

干货|SpringCloud之注册中心如何选用

SpringCloud的框架并不陌生了&#xff0c;在业内微服务领域的扛把子。今天来看一看如何根据业务需要&#xff0c;来选择合适的注册中心&#xff1f; 注册中心是微服务管理节点通信、核心配置的关键组件&#xff0c;从分布式多节点的前提下最主要要解决是就是分布式下的一致性问…

教你领取免费的亚马逊云服务服务器并搭建服务器环境的方法教程

本篇文章主要讲解&#xff0c;亚马逊新用户注册领取亚马逊免费服务器的详细操作流程方法,以及如何规避免费服务器到期后自动续费的问题解决办法。 作者&#xff1a;任聪聪 日期&#xff1a;2023年6月2日 前提材料准备 1.需要先准备好你的亚马逊账号注册所需的手机号、邮箱、vi…

18-Vue3中一些新的组件

目录 1、Fragment2、Teleport3、Suspense 1、Fragment 在Vue2中: 组件必须有一个根标签在Vue3中: 组件可以没有根标签, 内部会将多个标签包含在一个Fragment虚拟元素中好处: 减少标签层级, 减小内存占用 2、Teleport 什么是Teleport&#xff1f;—— Teleport 是一种能够将我…

一个开源的基于golang开发的企业级物联网平台

SagooIOT是一个基于golang开发的开源的企业级物联网基础开发平台。负责设备管理和协议数据管理&#xff0c;支持跨平台的物联网接入及管理方案&#xff0c;平台实现了物联网开发相关的基础功能&#xff0c;基于该功能可以快速的搭建起一整套的IOT相关的业务系统。旨在通过可复用…

测试4年,费时8个月,入职阿里,涨薪14K,可算是熬出头了····

前言 你的努力&#xff0c;终将成就无可替代的自己 本科毕业后就一直从事测试的工作&#xff0c;和多数人一样&#xff0c;最开始从事功能测试&#xff08;所谓的点点点&#xff09;的工作&#xff0c;看着自己的同学一步一步往上走&#xff0c;自己还是在原地踏步&#xff0c;…

java打jar包并包装成exe解压即用

1首先找到要加载的main方法类 public static void main(String[] args) { //创建该对象则调用构造方法&#xff0c;对象实现ActionListener则自动调用actionPerformed&#xff08;&#xff09;方法new PicdealMain();}2.点击 idea&#xff1a;File->Project Struce…(快捷键…

MyBatis深入学习总结(1.0)

MyBatis总结 MyBatis入门操作 简介 原始jdbc操作&#xff08;查询数据&#xff09; 原始jdbc操作&#xff08;插入数据&#xff09; 原始jdbc操作的分析 原始jdbbc开发存在的问题如下&#xff1a; 数据库连接创建、释放频繁造成系统资源的浪费从而影响系统性能sql语句在代…

3年经验,面试测试开发岗25K都拿不到了吗?这么坑?

最近后台读者说自己最近在疯狂投简历&#xff0c;有的石沉大海&#xff0c;但还好不是全军覆没。前两天好不容易熬到了阿里的四面&#xff0c;跟我聊了一下&#xff0c;面试官拿哪些题为难了他&#xff1f; 前面几题还好&#xff0c;问的是有关JVM的一些问题&#xff0c;比如说…

一道Java经典面试题 99%都有可能做错

前言 最近在面试中遇到一个关于位运算的题目 如下图 请问这个aString打印值是多少 学过位运算我们都知道 9<<4位 用2进制表示就是0000 1001 如果按照我之前的算法就是 0000 10001 向左位运算4 得到 1001 0000 这个时候我们得到的值就是 12816 144 拿到144这个值我们再…

session.upload_progress文件包含漏洞

session.upload_progress文件包含漏洞 前言 之前学习了该漏洞&#xff0c;但是没有做笔记&#xff0c;导致容易遗忘。在此用一个题目来理解session.upload_progress漏洞 基础知识 session存储 我们在phpinfo可以看到session的存储路径&#xff1a; 以下是一些session在lin…

【Python文本处理】基于运动路线记录GPX的文件解析,GPX转SRT字幕文件(不需要安装三方库)

【Python文本处理】基于运动路线记录GPX的文件解析&#xff0c;GPX转SRT字幕文件&#xff08;不需要安装三方库&#xff09; 解析和转换 GPX文件格式 GPX文件本身其实就是坐标、海拔、时间、心率等综合性的xml文件 如图&#xff1a; 海拔&#xff1a;ele 时间&#xff1a;t…

【GTest】使用CMakeLitsts.txt构建Windows和Linux的跨平台GoogleTest项目(非常详细+亲测有效)

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化 &#x1f449;专__注&#x1f448;&#xff1a;专注主流机器人、人工智能等相关领域的开发、…