antd中Select大数据分页触底刷新处理优化

平时使用antd中Select的下拉一般就几十几百条,这时候直接使用组件模糊查询就能实现大部分业务场景需求。

今天遇到一个需要模糊查询并且总量上万条的下拉框,如果一次性怼上去上万条,会造成浏览器卡顿。所以这边采用后端分页,前端触底加载刷新的方式去优化这个模糊查询。

<Select
   allowClear  //支持清除
   showSearch  //支持输入
   filterOption={false}   //这个参数false才能支持接口数据动态刷新
   style={{ width: '100%' }}
   onSearch={this.diagNameonSearch}  //输入
   onChange={this.diagNameChange}
   onPopupScroll={this.onPopupScroll}  //监听下拉事件
   placeholder={'请选择诊断'}
   getPopupContainer={triggerNode => (triggerNode.parentElement || document.body)} //防止页面滚动导致下拉框错位
 >
   {Array.isArray(diagNameList) && diagNameList.map((item: any) => {
     if (item.itemName) {
       return <Option value={item.itemName}>11{item.itemName}</Option>
     }
   })
   }
 </Select>
diagNameChange = (e: any, action: any) => { //选择事件
  this.updateState({ diagName: e, });
  console.log(action, 'action')
  if (action === undefined) {
    this.props.dispatch({
      type: 'admissionRecordCheck/pageGet',
      payload: {
        keyword: '',
        pageNum: 1,
        pageSize: 10,
      },
    })
  }
};
diagNameonSearch = (e: any) => { //输入事件
  clearTimeout(this.state.antiShake) //加入防抖  防止输入时反复调用接口
  this.setState({
    antiShake: setTimeout(() => {
      this.updateState({ //保存当前输入值  用于后续触底刷新
        keyword: e,
      })
      this.props.dispatch({
        type: 'admissionRecordCheck/pageGet',
        payload: {
          keyword: e,
          pageNum: 1,
          pageSize: 10,
        },
      })
    }, 1000)
  })
}
onPopupScroll = (e: any) => { //滚动事件 用于判断触底刷新
  const { pageGetpageNum, pageGetpageSize, diagNameList, keyword } = this.props.admissionRecordCheck
  const { target } = e;
  const { scrollTop, scrollHeight, clientHeight } = target;
  if (scrollTop + clientHeight == scrollHeight) { //触底 触发分页查询接口!
    this.props.dispatch({
      type: 'admissionRecordCheck/pageGetScroll',
      payload: {
        keyword,
        pageNum: pageGetpageNum + 1,
        pageSize: 10,
      },
    }).then((res: any) => {
      if (res && res.resultCode == "000000") {
        let dataList = Array.isArray(res.data.dataList) ? res.data.dataList : []
        this.updateState({
          diagNameList: diagNameList.concat(dataList), //合并原数组
          pageGetpageNum: pageGetpageNum + 1,
        })
      } else {
        (res && res.resultMsg) ? message.warning(`${res.resultMsg}`) : message.error('请求错误!')
      }
    })
  }

}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
antd 设置前端分页,可以使用 Table 组件的 pagination 属性。具体步骤如下: 1. 在 Table 组件设置 dataSource 属性为数据数组,columns 属性为表格列的配置数组。 2. 设置 pagination 属性为一个对象,该对象包含以下属性: - current:当前页码,默认为 1。 - pageSize:每页显示的数量,默认为 10。 - total:总数据量,用于计算页数。 - onChange:页码改变的回调函数,可以在该函数更新当前页码。 示例代码: ``` import { Table } from 'antd'; const dataSource = [ { id: 1, name: '张三', age: 18 }, { id: 2, name: '李四', age: 20 }, { id: 3, name: '王五', age: 22 }, // ... ]; const columns = [ { title: 'ID', dataIndex: 'id', key: 'id' }, { title: '姓名', dataIndex: 'name', key: 'name' }, { title: '年龄', dataIndex: 'age', key: 'age' }, // ... ]; function MyTable() { const [pagination, setPagination] = useState({ current: 1, pageSize: 10, total: dataSource.length, onChange: (page) => { setPagination({ ...pagination, current: page }); }, }); const start = (pagination.current - 1) * pagination.pageSize; const end = start + pagination.pageSize; const displayedData = dataSource.slice(start, end); return ( <Table dataSource={displayedData} columns={columns} pagination={pagination} /> ); } ``` 在上面的示例,我们使用 useState 来保存 pagination 对象,并根据当前页码和每页显示的数量来计算需要显示的数据。在 Table 组件,我们将 dataSource 设置为 displayedData,也就是经过分页后的数据,pagination 设置为我们保存的 pagination 对象。当页码改变时,我们更新 current 属性,并重新计算需要显示的数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值