博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
解决AutoComplete数据过多时的卡顿问题
阅读量:7079 次
发布时间:2019-06-28

本文共 1297 字,大约阅读时间需要 4 分钟。

  • 如下代码,data数据超过2千条时,每次输入字符过滤时非常卡
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使用防抖函数

办法一可以减少事件的触发,但是仍然无法避免一个问题,就是首次点击输入框的时候特别卡,因为这个时候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(    
)}

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

你可能感兴趣的文章
玩转redis缓存
查看>>
(转载)直播一:H.264编码基础知识详解
查看>>
企业如何真正使用Docker
查看>>
Chrome 控制台console的用法(学了之后对于调试js可是大大有用的哦)
查看>>
angularjs my97 datepicker directive demo
查看>>
虐心,Hello World
查看>>
[雪峰磁针石博客]python库介绍-collections:高性能容器数据类型
查看>>
USB4 规范发布,双倍带宽,达到 40 Gbps
查看>>
开源中国 2018 年度榜单之国产新秀榜
查看>>
Microsoft Edge同源策略不严导致任意文件读取测试
查看>>
升级phpstudy2018默认mysql版本到5.7
查看>>
一位android开发程序猿的小工具集合
查看>>
Mybatis 动态 SQL 详解
查看>>
1024. Palindromic Number (25)
查看>>
【译Py】数据科学面试终极指南04
查看>>
PyCodeInjectionShell - 自动Python代码注入工具
查看>>
sharding-jdbc不分库策略在springboot的application.properties中的写法
查看>>
SEO权重的优化1
查看>>
Linux基本bash命令(持续更新)
查看>>
[JavaScript 学习笔记] 2. 继承
查看>>