antd Select进阶功能 动态更新、函数防抖

一、动态更新Options

Antd Select自带的搜索功能很多时候需要结合后端的接口,输入一个关键字的时候会自动更新选择器的选项. 下面列一些注意点

基础实现

选择器选项必须和每次更新的数据挂钩, 这个值可以通过state,也可以通过props拿到

再结合循环的方法例如map遍历渲染options

import React, { PureComponent, Fragment } from ‘react‘
import { Select } from ‘antd‘
import axios from ‘axios‘
const Option = Select.Option;

export default class AntSelect extends PureComponent{
    ...

    handleSearch = (keywords) => {
        //请求后端搜索接口
        axios(‘http://xxx.com/xxx‘, {
            keywords,
        }).then(data){
            this.setState({
                list: data
            })
        }
    }

    render(){
        const { list } = this.state;
        return(
            <Select
                mode="multiple"         //多选模式
                placeholder="请选择"
                filterOption={false}    //关闭自动筛选
                onSearch={this.handleSearch}
            >
                {
                    list.map((item, index) => (
                        <Option key={index} value={item}>{item}</Option>
                    ))
                }
            </Select>
        )
    }
    ...
}

上面就是一个简单的例子. 除了要动态渲染Options以外, 还需要注意设置这个属性:

filterOption={false}

如果不设置会导致即使拿到了最新的数据还是依旧显示无匹配结果

因为filterOption默认为true, 当你输入内容时候,会先在已有选项里面寻找符合项, 无论是否找到,都会重新渲染Options,这样你接口请求的数据的渲染被覆盖了, 自然看不到结果了。所以需要把它关掉!

二、函数防抖

性能优化

因为输入是属于高频js的操作, 所以我们需要使用到函数节流或者函数防抖.

这里我直接使用函数防抖插件:lodash/debounce

import debounce from ‘lodash/debounce‘;

//在constructor统一绑定事件. 和经常使用的bind(this)一样
class AntSelect extends React.Component {
  constructor(props) {
    super(props);

    this.handleSearch = debounce(this.handleSearch, 500);
  }

  handleSearch = (value) => {
      ...
  }
  ...
}

这样你在输入数据的500ms后才会触发handleSearch函数,可以大幅度减少调取后台接口的次数!

出现加载状态

antd已经给我们封装好了加载状态的组件:<Spin />.然后通过state控制其出现和消失

class antdSelect extends React.Component {
    constructor(props) {
        super(props);

        this.state = {
            spinState: false,
        }
      }

    handleSearch = (keywords) => {
        ...
        //调用接口前清空数据, 出现加载icon
        this.setState({
            list: [],
            spinState: true
        })

        //请求后端搜索接口
        axios(‘http://xxx.com/xxx‘, {
            keywords,
        }).then(data){
            this.setState({
                list: data,
                spinState: false
            })
        }
        ...
    }

    render(){
        const { list, spinState } = this.state;
        return(
            <Select
                ...
                notFoundContent={spinState ? <Spin /> : ‘暂无数据‘}
                onSearch={this.handleSearch}
                ...
            >
                {
                    list.map((item, index) => (
                        <Option key={index} value={item}>{item}</Option>
                    ))
                }
            </Select>
        )
    }
}

更多的可以查看官方文档: 《Antd-Select》

原文地址:https://www.cnblogs.com/soyxiaobi/p/9984491.html

时间: 2024-11-09 17:18:28

antd Select进阶功能 动态更新、函数防抖的相关文章

iOS 程序插件及功能动态更新思路

所用框架及语言 iOS客户端-Wax(开发愤怒的小鸟的连接Lua 和 Objc的框架),Lua,Objc, 服务端-Java(用于返回插件页面) 工具框架链接地址:Wax - https://github.com/probablycorey/wax  Netty - https://netty.io/  用做Http服务器,返回页面 由于Lua脚本语言,不需要编译即可运行,这点是我的这个思路可以执行的大前提,再加上苹果允许像Lua这样的脚本的存在,这一思路才能得以实现.个人感觉这一思路有点类似于

微信小程序之使用函数防抖与函数节流

函数防抖和函数节流都是老生常谈的问题了.这两种方式都能优化 js 的性能.有些人可能会搞混两个的概念.所以,我以自己的理解,来解释这两个概念的含义.并且列举在小程序中这两个方法的使用. 函数防抖: 英文 debounce 有防反跳的意思,大致就是指防止重复触发. 那么,函数防抖,真正的含义是:延迟函数执行.即不管debounce函数触发了多久,只在最后一次触发debounce函数时,才定义setTimeout,到达间隔时间再执行 需要防抖的函数. 用处:多用于 input 框 输入时,显示匹配的

JS动态更新HTML5 APP页面的结构(包括功能和布局)

HTML5 APP开发算是越来越流程了.当然,开发这样的HTML5 APP有什么好处呢.笔者认为:可以通过后台JS动态更新HTML5 APP页面的结构,是一大优势. 那如何实现该功能呢. 首先,得知道其原理:为什么可以通过后台JS就可以更新前台APP. 接着,得知道操作步骤是怎样的. 详细内容,可以查看如下链接: HTML5 APP 实现后台JS更新APP前端页面功能 HTML5 APP开发之动态调整页面布局 如需要源码,请@我 (一份完整的源代码,收费1元)

IOS-使用framework实现功能模块动态更新

测试Xcode版本为6.1.1 实现过程简述:把想要的作为动态更新的模块,移动到我们创建的Framework工程中,然后得到我们想要的动态库文件,把此文件再通过iTunes放到"主程序"项目的document文件夹下,从而实现从主程序中去加载此动态库,从而实现功能模块的动态更新效果.理想效果为支付宝APP,而支付宝采用的是HTML5(网页)的形式实现的,这是目前最通用的实现方式,但是不适用于复杂界面效果. 第一步:创建IOS Framework工程 第二步:生成的工程中原本的类删掉不用

oracle 隐式游标,显示游标,游标循环,动态SELECT语句和动态游标,异常处理和自定义异常

游标的概念:    游标是SQL的一个内存工作区,由系统或用户以变量的形式定义.游标的作用就是用于临时存储从数据库中提取的数据块.在某些情况下,需要把数据从存放在磁 盘的表中调到计算机内存中进行处理,最后将处理结果显示出来或最终写回数据库.这样数据处理的速度才会提高,否则频繁的磁盘数据交换会降低效率.游标有两种类型:显式游标和隐式游标.在前述程序中用到的SELECT...INTO...查询语句,一次只能从数据库中提取一行数据,对于这种 形式的查询和DML操作,系统都会使用一个隐式游标.但是如果要

定时动态更新图表

在进行实现动态更新图表时主要使用AJAX技术,主要分两种实现方法,一种是通过ASP.NET特有的AJAX控件,UpdatePanel.Timer控件+ASP.NET自带的Chart控件实现:另一种为使用第三方的图表库+JQUERY\AJAX实现. ASP.NET控件实现 实现: 前台将要定时刷新的内容放到updatePanel中即可,前台代码如下: <form id="form1" runat="server"> <asp:ScriptManage

JSPatch – 动态更新iOS APP

博文转载至 http://blog.cnbang.net/works/2767/ JSPatch是最近业余做的项目,只需在项目中引入极小的引擎,就可以使用JavaScript调用任何Objective-C的原生接口,获得脚本语言的能力:动态更新APP,替换项目原生代码修复bug. 用途 是否有过这样的经历:新版本上线后发现有个严重的bug,可能会导致crash率激增,可能会使网络请求无法发出,这时能做的只是赶紧修复bug然后提交等待漫长的AppStore审核,再盼望用户快点升级,付出巨大的人力和

highChart数据动态更新

highChart官网上通过ajax加载数据的例子 上面是第一次生成图表的时候使用 我想动态更新,在已经生成的图表上动态更新 chartBS.series[0].setData(sugarListDataBefore); chartBS.series[0].name=beforeTimeName; chartBS.series[1].setData(sugarListDataAfter); chartBS.series[1].name=afterTimeName; chartBS.redraw(

iOS 动态更新

iOS 动态更新 App 动态更新 1.控件到 window 的层级关系: 2.分析控件的详细路径: 3.动态修改控件: 4.工具篇: 视图的层级关系: 每个 App , 至少有一个根 Window , 通常情况下我们只用一个 .window 有一个 rootViewController , 这就是我们所谓的根视图 , 我们所有的控制器都是放在 rootViewController 里面的. 这个是最简单的层级关系 如果在项目里有了这么一个路径 , 我们可以做什么呢? 在当项目很复杂 , 可以其