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

解决AutoComplete数据过多时的卡顿问题

  • 如下代码,data数据超过2千条时,每次输入字符过滤时非常卡
<AutoComplete
  dataSource={data}
  onChange={this.handleChange }
  allowClear={true}
  filterOption={
    (inputValue, option) => option.props.children.toUpperCase().indexOf(inputValue.toUpperCase()) !== -1
  }
/>

其原因: 每次输入变化,data就要从2000多条数据中过滤出目标元素,一过滤就导致AutoComplete下拉列表得变化,浏览器得重新绘制下拉列表的Dom,导致浏览器卡

解决办法一

采用防抖函数,在间隔时间内,连续输入字符串只在最后一个字符串发生时才触发事件(onChange默认输入内容已改变就触发事件)

  • 防抖函数
let timer;
export const debounce = (func, wait ) => {
  // let timer = 0;
  return function(...args) {
    if (timer) clearTimeout(timer);

    timer = setTimeout(() => {
      func.apply(this, args);
    }, wait);
  };
};
  • 使用AutoComplete使用防抖函数
<AutoComplete
  dataSource={data}
  onChange={debounce(this.handleChange) }
/>

办法一可以减少事件的触发,但是仍然无法避免一个问题,就是首次点击输入框的时候特别卡,因为这个时候2000多条数据要一次被渲染
然而,没有人会无聊到从2000多条数据滚动鼠标去查找自己的目标元素,都会通过输入关键字符去过滤查找
所以首次没必要加载这么多数据,可以默认截取原数据的前50条来显示即可
后面在输入框输入关键词后,将过滤好后的数据在赋给dataSource减少不必要的Dom渲染

解决办法二,防抖和过滤二合一解决

  static getDerivedStateFromProps (props, state) {
    return{
      originDataLists: props.originDataLists,
      currentDataLists: state.currentDataLists.length>0 ?state.currentDataLists : props.currentDataLists.slice(1,100)
    }
  }
onChange = (value) => {
  const {originDataLists} = this.state
  const currentDataLists = originDataLists.filter(item = item.toUpperCase().includes(value.toUpperCase()))
  this.setState({currentDataLists});
};

render(){
  const {currentDataLists} = this.state
  return(
    <AutoComplete
      dataSource={currentDataLists}
      onChange={debounce(this.handleChange) }
    />
  )
}

转载于:https://www.cnblogs.com/huangxingyuan/p/10709684.html

相关文章:

  • postgresql行列转换函数
  • 怎么获取红米6 Pro的root权限
  • AAC架构系列一(初识)
  • Jboot 2.0.7 发布,分布式事务新增对 HikariCP、C3P0 等连接池的支持
  • mybatis特殊字符转义
  • 软件测试2019:第三次作业
  • JavaEE (13种技术都是什么?)
  • 一个SQL无法kill掉的案例
  • Delphi中Move、CopyMemory操作
  • 零基础如何高效的学习java开发?
  • 基于 Django2 实现邮箱注册登录功能
  • klock 分布式锁重大更新
  • python 基础问题,包括语法等
  • Spark- SparkSQL中 Row.getLong 出现NullPointerException错误的处理方法
  • 原子性问题的解决思路--锁
  • 自己简单写的 事件订阅机制
  • 〔开发系列〕一次关于小程序开发的深度总结
  • Android交互
  • CSS 三角实现
  • Idea+maven+scala构建包并在spark on yarn 运行
  • Java基本数据类型之Number
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • JSDuck 与 AngularJS 融合技巧
  • MQ框架的比较
  • python docx文档转html页面
  • React Transition Group -- Transition 组件
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • supervisor 永不挂掉的进程 安装以及使用
  • vue的全局变量和全局拦截请求器
  • Webpack 4 学习01(基础配置)
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • 如何学习JavaEE,项目又该如何做?
  • 删除表内多余的重复数据
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (ZT)薛涌:谈贫说富
  • (翻译)terry crowley: 写给程序员
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (七)理解angular中的module和injector,即依赖注入
  • (一)80c52学习之旅-起始篇
  • * 论文笔记 【Wide Deep Learning for Recommender Systems】
  • ./configure,make,make install的作用
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • .NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法
  • .NET 事件模型教程(二)
  • @ 代码随想录算法训练营第8周(C语言)|Day53(动态规划)
  • @Controller和@RestController的区别?
  • [C#]C# winform部署yolov8目标检测的openvino模型
  • [C#]C#学习笔记-CIL和动态程序集
  • [c++] 什么是平凡类型,标准布局类型,POD类型,聚合体
  • [C++数据结构](31)哈夫曼树,哈夫曼编码与解码