深入理解Antd-Select组件的用法


Posted in Javascript onFebruary 25, 2020

一、Antd-Select提供几种类型

  • 最基础版只提供下拉功能的选择器
  • 带搜索功能的下拉选择器
  • 可多选的下拉选择器
  • 可搜索、可多选、可随意输入内容的tag下拉选择器(支持自动分词)
  • 多级联动下拉选择器
  • 搜索远程数据下拉框

二、一些潜在用法

如果Select.Option选项的数量特别大:2k、3k...

假设请求数据时间我们都解决好了,信心满满地准备把数据填充到<Select.Option>后下班!过会你会发现有多绝望..

这下拉框加载了10s还没出来!?这时候先想着去antd文档上找解决方法,无果后百度、SF、google....因为antd每次都会重新渲染<Select.Option>,所以要降低卡顿时间,唯一办法就是减少渲染的数量

可以来体验一下:《antd-Select加载2k条数据演示》

发现问的人倒挺多,真正解决的回答没见到几个(我还没找到..)
有的劝着放弃吧,加了那么多用户也不会看(确实如此),改做成一个搜索下拉框.稍微执拗一点的继续挣扎,终于找到了一个能优化加载速度的插件《react-select-fast-filter-options》
然后过会又发现,搜索功能肯定也需要的呀!总不能让用户翻那2000条数据.不然可能半夜还在被投诉.

带着最后一点希望,找了一下github上antd的Issues,里面给的回答倒是挺有启发的,但是还是没有正确的解决办法.《ant-design:Issues》

于是就自己设计了一个,新手代码请见谅,希望对你有帮助.

//render
const { optionsData } = this.state;

<Select style={{ width: 200 }} 
  showSearch
  onChange={this.handleSecChange}
  placeholder="请输入/选择xxx"  
  onSearch={this.handleSerach}
>
{
  optionsData.length && optionsData.map( (item, index) => (
    <Select.Option key={index} value={item}>{item}</Select.Option>)
  ) 
}
</Select>
//搜索Value值改变触发回调函数
handleSerach(e){
 let { clusterValue } = this.state;
 let that = this;
 //类似函数节流
 setTimeout(function(){
  that.loadOption(clusterValue, e)
 },300)
 
}

loadOption(clusterValue, keyWords){
  const { options } = this.props.data;  //获得2k条数据
  let newOptionsData = [];
  let arrData = options[clusterValue]; 
  if(Object.keys(options).length){
   let len;
   if(arrData.length > 100) len = 100;
   else len = arrData.length;
   
   //初始化
   if(keyWords == ''){
    for(var i=0;i<len;i++){
     newOptionsData.push(arrData[i])
    } 
   }
    
   //用户搜索
   else{
    newOptionsData = [];
    for(var j = 0; j < arrData.length; j++){
     if(arrData[j].indexOf(keyWords) != -1){
      newOptionsData.push(arrData[j]);
      if(newOptionsData.length > 100) break;
     }
    }     
   } 
  }

  // return newOptionsData
  this.setState({
   optionsData: newOptionsData
  })
}
  • 在handleSearch函数添加定时是为了解决每次输入都立刻请求,导致卡顿;用户输入完成后再统一查找,虽然会导致在搜索的时候增加300ms空白期,但是比用户输入卡顿要好
  • 把渲染数量控制在100条内,防止卡顿,一般用户查找一个数据,也会输入得比较完整,不可能会在100条内查找。
  • 区分初始化和搜索两个不同情况,用户刚进入界面的时候,并没有关键字搜索,所以这时候要初始化前100条内容给用户,当然你也可以按照一定的条件渲染数据给用户,只要保证合理数量以内即可
  • 因为我的数据是多级联动的
options:{
'key': [xxx,xxx1,xxx2...],
'key1': [xxx,xxx1,xxx2...]
}

所以我的写法是options[xxx],然后遍历相应的数组即可

当然这仅仅是一种思路,更好的实现方法有很多!希望这能成为你的方法的一个垫脚石

有时候多看看官方文档真的很有帮助.学习的不仅仅是它的方法,还有它的思路。如果遇到它的一些特殊语法(语法糖),也可以到ant-design-pro里查阅

《ant-design-pro》

使用antd UI框架中的select需要注意的一些问题

问题1:滚动跟随问题

问题描述:使用表单时,当页面过长出现滚动,select的下拉框不会跟随输入框,造成用户体验性不好

解决方法:在 Option 或Select.Option 中添加 getPopupContainer={(triggerNode) => triggerNode.parentNode},完美解决

问题2:可输入过滤选项问题

问题描述:通过输入过滤选项

解决方法:在 Option 或Select.Option 中添加 showSearch 与 optionFilterProp="children",完美解决

问题3:动态加载

问题描述: 动态分页加载option的选项,并且,滚动加载更多,可支持关键字搜索(由后端查询数据库放回数据)
解决方法::
1、当搜索框聚焦时,获取数据,如10条,关键字为空
2、将数据遍历到option选项中
3、选项的滚动,当滚动到底部时,加载下一页的数据,在option中添加方法 onPopupScroll={this.scrollMore} scrollMore函数如下

scrollMore = (e) => {
 e.persist();
 if(this.state.scrollFlag){  //scrollFlag 节流阀,防止操作频繁没将数据完全加载
 const { target } = e;
 if ((target.scrollTop + target.offsetHeight) > (target.scrollHeight-25)) { //当滚动到最底部25像素的时开始加载
  const { Params } = this.state;
  var pindex = Params.pageIndex +1;
  if(pindex <= this.state.pageEnd){ //判断要查询的页是否已经是最后一页了
  this.setState({
   scrollFlag: false,
   Params:{...this.state.Params,pageIndex:pindex}
  },() => {
   this.getList();  //获取option的数据
  })
  }
 }
 }
}

至此,滚动加载完成,要注意,在每次聚焦的时候,pageIndex都要先置为1,即从第一页开始查询,否则就是从先前滚动到的那一页。在获取到数据之后,即在getList函数内,要对获取到的数据进行处理,要把获取到的数据拼接在list后面,否则会造成加载更多时之前的数据不见了,并且,在pageIndex是1的时候不拼接,直接赋值。

4、在输入值时会触发option的onSearch事件,在函数里进行查询并重新复制list

此时,会发现一个问题,查询后的值不会马上出来,会等到下一次聚焦搜索框时才会出现。

解决方法:在option中加 filterOption={false}
这样就实现了条件的过滤和关键字的过滤。

到此这篇关于深入理解Antd-Select组件的用法的文章就介绍到这了,更多相关Antd-Select组件内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
javascript (用setTimeout而非setInterval)
Dec 28 Javascript
js获取判断上传文件后缀名的示例代码
Feb 19 Javascript
JS实现简单的顶部定时关闭层效果
Jun 15 Javascript
Jquery 实现弹出层插件
Jan 28 Javascript
javascript实现平滑无缝滚动
Aug 09 Javascript
JavaScript实现Java中Map容器的方法
Oct 09 Javascript
谈谈JS中常遇到的浏览器兼容问题和解决方法
Dec 17 Javascript
JavaWeb表单及时验证功能在输入后立即验证(含用户类型,性别,爱好...的验证)
Jun 09 Javascript
JavaScript 中的 this 工作原理
Jun 20 Javascript
Vue.js图片预览插件使用详解
Aug 27 Javascript
layui 上传插件 带预览 非自动上传功能的实例(非常实用)
Sep 23 Javascript
详解vue-router 动态路由下子页面多页共活的解决方案
Dec 22 Javascript
京东优选小程序的实现代码示例
Feb 25 #Javascript
手把手带你入门微信小程序新框架Kbone的使用
Feb 25 #Javascript
vue 路由守卫(导航守卫)及其具体使用
Feb 25 #Javascript
Javascript地址引用代码实例解析
Feb 25 #Javascript
Javascript如何实现双指控制图片功能
Feb 25 #Javascript
vue-video-player 解决微信自动全屏播放问题(横竖屏导致样式错乱问题)
Feb 25 #Javascript
通过js实现压缩图片上传功能
Feb 25 #Javascript
You might like
PHP 错误之引号中使用变量
2009/05/04 PHP
php下正则来匹配dede模板标签的代码
2010/08/21 PHP
基于PHP编程注意事项的小结
2013/04/27 PHP
jquery实现的元素的left增加N像素 鼠标移开会慢慢的移动到原来的位置
2010/03/21 Javascript
基于jquery的给文章加入关键字链接
2010/10/26 Javascript
js滚动条回到顶部的代码
2011/12/06 Javascript
JS打开图片另存为对话框实现代码
2012/12/26 Javascript
在firefox和Chrome下关闭浏览器窗口无效的解决方法
2014/01/16 Javascript
javascript动态控制服务器控件实例
2014/09/05 Javascript
javascript实现限制上传文件大小
2015/02/06 Javascript
JS实现滑动菜单效果代码(包括Tab,选项卡,横向等效果)
2015/09/24 Javascript
JS+CSS实现大气清新的滑动菜单效果代码
2015/10/22 Javascript
Vuex简单入门
2017/04/19 Javascript
jQuery Layer弹出层传值到父页面的实现代码
2017/08/17 jQuery
JS动态添加的div点击跳转到另一页面实现代码
2017/09/30 Javascript
原生JS实现图片无缝滚动方法(附带封装的运动框架)
2017/10/01 Javascript
[02:08]DOTA2英雄基础教程 马格纳斯
2014/01/17 DOTA
[01:38]【DOTA2亚洲邀请赛】Sumail——梦开始的地方
2017/03/03 DOTA
浅析Python多线程下的变量问题
2015/04/28 Python
python简单实现旋转图片的方法
2015/05/30 Python
深入理解Django的中间件middleware
2018/03/14 Python
解决Python的str强转int时遇到的问题
2018/04/09 Python
Python使用re模块正则提取字符串中括号内的内容示例
2018/06/01 Python
利用Python读取txt文档的方法讲解
2018/06/23 Python
在python中利用numpy求解多项式以及多项式拟合的方法
2019/07/03 Python
解决Django migrate不能发现app.models的表问题
2019/08/31 Python
Python reshape的用法及多个二维数组合并为三维数组的实例
2020/02/07 Python
pyecharts调整图例与各板块的位置间距实例
2020/05/16 Python
Python 创建TCP服务器的方法
2020/07/28 Python
荷兰和比利时时尚鞋店:Van Dalen
2018/04/23 全球购物
2014年清明节网上祭英烈寄语
2014/04/09 职场文书
个人批评与自我批评范文
2014/10/17 职场文书
2014年会计工作总结
2014/11/27 职场文书
办公用品质量保证书
2015/05/11 职场文书
JS前端canvas交互实现拖拽旋转及缩放示例
2022/08/05 Javascript
Java实现贪吃蛇游戏的示例代码
2022/09/23 Java/Android