antd renderFormItem AutoComplete结合防抖导致防抖失效的解决办法

news2025/3/1 23:20:35

业务背景

我们有一个需求是在用户输入用例名称的时候,系统根据名称去匹配公共用例库中的用例模块展示在下拉框中,然后用户可选择想要的模块导入其中的用例:

在这里插入图片描述
但是如果用户每输入一个字符就去调用接口查询的话,这样就太频繁了,会给服务端造成不小的压力,所以就需要使用防抖方法来进行限流控制。这里的方案如下:
因为antd提供了AutoComplete方法能够很方便的在表格中实现编辑行的操作,这里也就不重新造轮子了,然后结合lodash提供的debounce方法进行防抖设置,也就是每隔200毫秒去搜索一次,完整的代码如下:

 const batchSearchDebounce = debounce(async (keyWords) => {
    if (keyWords) {
      return await searchComStdMod({ search: keyWords }).then((res) => {
        const data: any[] = [];
        res.data.forEach((item: any) => {
          data.push({
            label: (
              <>
                <Tag color="blue">公共模块</Tag>
                {item.label}
              </>
            ),
            value: item.value,
            name: item.label,
          });
        });
        setSearchData(data);
      });
    }
  }, 200);

   <AutoComplete
        style={{ width: width }}
        placeholder="请输入用例名称"
        onSelect={(_: any, mod: any) => {
          comStandardCasesAll({ module_id: mod.value }, REQ_LIST).then((res) => {
            setFormData({ cases: res.data, module_name: mod.name });
            setVisible(true);
          });
        }}
        {...(type === 'single' ? {} : { value: batchData.value })}
        onChange={async (keyWords) => {
          batchData.onChange(keyWords);
          await batchSearchDebounce(keyWords); //防抖会失效
        }}
        options={searchData}
      />

但在使用的过程中发现防抖并没有生效,我每输入一个文字就会搜索一次,1秒内输入10下就会有10个请求发出去:
在这里插入图片描述

造成这个问题的原因是什么呢

是因为AutoComplete中的onChange的事件,当每次改变的时候都会创建一个debounce方法,所以onChange事件触发10次,就会有10个防抖函数并执行。

如何解决

我们可以使用useCallback将防抖方法进行缓存,避免不必要的刷新重建就可以了。

如下所示,useCallback有两个参数:

useCallback(fn, deps)`

fn:要缓存的函数,在初始渲染期间,React将返回你的函数。在下一次渲染时,如果依赖关系(也就是deps)自上次渲染以来没有改变,React将再次给你相同的函数。
deps: 是一个数组,当里面的元素发生改变的时候会重新渲染函数。

因为,我们结合useCallback这里我们将batchSearchDebounce 做一下修改即可:

  const batchSearchDebounce = useCallback(
    debounce(async (keyWords: string) => {
      if (keyWords) {
        batchData.onChange(keyWords);
        return await searchComStdMod({ search: keyWords }).then((res) => {
          const data: any[] = [];
          res.data.forEach((item: any) => {
            data.push({
              label: (
                <>
                  <Tag color="blue">公共模块</Tag>
                  {item.label}
                </>
              ),
              value: item.value,
              name: item.label,
            });
          });
          setSearchData(data);
        });
      }
    }, 200),
    [],
  );

使用useCallback之后就不会出现上述的问题了,防抖方法也就生效了:

在这里插入图片描述
useCallback 它可以让你在重新渲染之间缓存函数,避免函数冗余的重新渲染,以此来提高性能,没想到因为这样的机制也能解决掉一些逻辑问题。

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

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

相关文章

基于开源IM即时通讯框架MobileIMSDK:RainbowChat-iOS端v8.0版已发布

关于MobileIMSDK MobileIMSDK 是一套专门为移动端开发的开源IM即时通讯框架&#xff0c;超轻量级、高度提炼&#xff0c;一套API优雅支持 UDP 、TCP 、WebSocket 三种协议&#xff0c;支持 iOS、Android、H5、标准Java、小程序、Uniapp&#xff0c;服务端基于Netty编写。 工程…

vivo发布“蓝心千询”自然语言对话机器人

&#x1f989; AI新闻 &#x1f680; vivo发布“蓝心千询”自然语言对话机器人 摘要&#xff1a;vivo今日发布了“蓝心千询”自然语言对话机器人&#xff0c;基于蓝心大模型。蓝心千询可以进行知识信息的快速问答&#xff0c;文学创作、图片生成&#xff0c;甚至还能编写程序…

CV论文阅读大合集

YearNameAreamodeldescriptiondrawback2021 ICMLClip &#xff08;Contrastive Language-Image Pre-training&#xff09;contrastive learning、zero-shot learing、mutimodel用文本作为监督信号来训练可迁移的视觉模型CLIP’s zero-shot performance, although comparable to…

js实现容器之间交换

&#x1f525;博客主页&#xff1a; 破浪前进 &#x1f516;系列专栏&#xff1a; Vue、React、PHP ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ JavaScript是一种非常流行和常用的编程语言&#xff0c;它在web开发中起着至关重要的作用&#xff0c;在实现网页动态交互、数据…

弹幕游戏制作,弹幕互动游戏开发,弹幕直播游戏

弹幕互动游戏是一种特殊类型的游戏&#xff0c;其中玩家可以在屏幕上发送实时评论或"弹幕"&#xff0c;这些评论通常以文字形式出现在游戏画面上&#xff0c;同时影响游戏的进行。这种游戏类型通常与实况直播和在线社交互动相结合&#xff0c;为观众提供了参与游戏和…

Qt 使用Quazip解压缩、压缩文件

1.环境搭建 Quazip&#xff0c;是在zlib基础上进行了简单封装的开源库&#xff0c;适用于多种平台&#xff0c;利用它可以很方便将单个或多个文件打包为zip文件&#xff0c;且打包后的zip文件可以通过其它工具打开。 下载Quazip QuaZIP download | SourceForge.net 解压后&…

阿里云99元服务器ECS经济型e实例是什么来头?

阿里云99元服务器ECS经济型e实例是什么来头&#xff1f;阿里云新品云服务器实例&#xff1a;ECS经济型e实例&#xff0c;价格优惠2核2G经济型e实例、3M带宽、40G ESSD entry系统盘&#xff0c;优惠价99元一年&#xff0c;老用户也可以买&#xff0c;第二年续费不涨价依旧是99元…

如何翻译shader graph到代码并添加额外的效果

使用shader graph翻译到代码可以使用连线工具快速制作效果并转换为代码&#xff0c;如果你对shader的“贴心/详细”报错&#xff0c;以及提示不完善等等问题感到恼火&#xff0c;这个方式或许可以一定程度上缓解以上问题。 本次使用的三个shader graph资源&#xff1a;https:…

速卖通卖家如何通过自己搭建测评补单系统,提高产品权重和排名?

速卖通卖家如何给店铺增加权重和排名&#xff1f; 在竞争激烈的速卖通平台上&#xff0c;为自己的店铺增加权重是吸引更多买家和提升销售的关键。店铺的权重决定着在搜索排名、推荐位和广告展示方面的优先级。今天珑哥为您介绍一些有效的策略&#xff0c;帮助您提升速卖通店铺…

Springboot使用EasyExcel导入导出Excel文件

1&#xff0c;准备Excel文件和数据库表结果 2&#xff0c;导入代码 1&#xff0c;引入依赖 <!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel --><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifac…

[鹏城杯 2022]简单的php 取反的另一种无数字字母rce 通过请求头执行命令

鹏城杯2022部分web-CSDN博客 无字母webshell | Bypass-腾讯云开发者社区-腾讯云 这里记录一下 首先获取过滤if(strlen($code) > 80 or preg_match(/[A-Za-z0-9]|\|"||\ |,|\.|-|\||\/|\\|<|>|\$|\?|\^|&|\|/is,$code)) 写个脚本看看还有什么没有被过滤 …

低成本语音芯片是如何写入语音到芯片里面otp和flash型

一、简介 低成本语音芯片是如何写入语音到芯片里面otp和flash型。低成本其实是一个相对的概念&#xff0c;比如&#xff1a;玩具类型的巨量产品&#xff0c;简单&#xff0c;它的低成本就是最低&#xff0c;能抠出来一分&#xff0c;就是一分。所以对芯片的要求就很高&#xf…

基于单片机设计的太阳能跟踪器

一、前言 随着对可再生能源的需求不断增长&#xff0c;太阳能作为一种清洁、可持续的能源形式&#xff0c;受到越来越多的关注和应用。太阳能光板通常固定在一个固定的角度上&#xff0c;这限制了它们对太阳光的接收效率。为了充分利用太阳能资源&#xff0c;提高太阳能光板的…

Oracle(10)Managing Undo Data

目录 一、基础知识 1、AUM :Init Parameters AUM:初始化参数 2、AUM:Other Parameters AUM:其他参数 3、AUM:Sizing an UNDO TS AUM:调整UNDOTS的大小 4、AUM :Undo Quota AUM:撤消配额 5、Get Undo Segment Info 获取撤消段信息 二、基础操作 1、AUM:UNDO Tablespace …

2、循环依赖详解(二)

bean的实例化过程源码解析 建议用IDEA的debug模式来观察Spring的IOC过程 进入到此类的构造方法中 查看setConfigLocations&#xff0c;就是将配置文件加载到configLocations里去 向下执行&#xff0c;查看refresh() this.prepareRefresh(): 此方法是准备工作&#xff0c;大家…

Spring Boot 3 整合 xxl-job 实现分布式定时任务调度,结合 Docker 容器化部署(图文指南)

目录 前言初始化数据库Docker 部署 xxl-job下载镜像创建容器并运行访问调度中心 SpringBoot 整合 xxl-jobpom.xmlapplication.ymlXxlJobConfig.java执行器注册查看 定时任务测试添加测试任务配置定时任务测试结果 结语附录xxl-job 官方文档xxl-job 源码测试项目源码 前言 xxl-…

防雷接地测试方法完整方案

防雷接地是保障电力系统、电子设备和建筑物安全的重要措施&#xff0c;防雷接地测试是检验防雷接地装置是否合格的必要手段。本文介绍了防雷接地测试的原理、方法和注意事项&#xff0c;以及如何编写防雷接地测试报告。 地凯科技防雷接地测试的原理 防雷接地测试的基本原理是…

人工智能快速发展时代下的“AI诈骗防范”

当前&#xff0c;AI技术的广泛应用为社会公众提供了个性化智能化的信息服务&#xff0c;也给网络诈骗带来可乘之机&#xff0c;如不法分子通过面部替换语音合成等方式制作虚假图像、音频、视频仿冒他人身份实施诈骗、侵害消费者合法权益。你认为AI诈骗到底应该如何防范&#xf…

TimeGPT-1——第一个时间序列数据领域的大模型他来了

一直有一个问题:时间序列的基础模型能像自然语言处理那样存在吗?一个预先训练了大量时间序列数据的大型模型&#xff0c;是否有可能在未见过的数据上产生准确的预测?最近刚刚发表的一篇论文&#xff0c;Azul Garza和Max Mergenthaler-Canseco提出的TimeGPT-1&#xff0c;将ll…

国内某发动机制造工厂RFID智能制造应用解决方案

一、工厂布局和装备 国内某发动机制造工厂的装配车间布局合理&#xff0c;设备先进&#xff0c;在这个5万平方米的生产区域内&#xff0c;各个工位之间流程紧密&#xff0c;工厂采用了柔性设备&#xff0c;占比达到了67%&#xff0c;数控化率超过90%&#xff0c;自动化率达到了…