zoukankan      html  css  js  c++  java
  • 解决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) }
        />
      )
    }
    
    
  • 相关阅读:
    【剑指offer】二叉搜索树与双向链表
    【剑指offer】复杂链表的复制
    【剑指offer】二叉树中和为某一值的路径
    2018.12.30 Intellij IDEA设置main方法自动补全
    2018.12.29 Spring FrameWork各个版本下载
    2018.12.26 Mac下的Eclipse在编辑Spring配置文件xml时自动提示类class包名配置
    2018.12.25 Spring中JDBCTemplate模版API学习
    2018.12.24 Spring中的aop演示(也就是运用aop技术实现代理模式)
    2018.12.22 Spring学习02
    2018.12.24 Ubuntu18.0.4 主题参考
  • 原文地址:https://www.cnblogs.com/huangxingyuan/p/10709684.html
Copyright © 2011-2022 走看看