基于React Antd远程 SearchSelect 组件,参数灵活可配置,持续迭代中~开源

23 篇文章 18 订阅
12 篇文章 0 订阅
本文档详细介绍了`react-antd-search-select`组件的使用方法,包括安装、全局配置、局部配置、搜索、多选、回显、onChange事件处理及自定义选项展示。该组件基于React和AntDesign,适用于React项目中的远程搜索需求,支持接口、参数、数据结构的自定义配置。
摘要由CSDN通过智能技术生成

目录

介绍

使用方式

安装

全局配置,定义你们的通用业务字段

局部使用

搜索

多选

回显

单选回显

多选回显

onChange

额外的后缀label

1. 自定义option右侧字段

2. 自定义option

修改接口返回数据字段、格式

结构相同,字段不一致

结构不同

API

Props

Antd Select API

Antd Select被组件占用的且无法修改的props,其他都可用


介绍

  1. SearchSelect基于ReactAnt Design,适用于React + Ant Design项目

  2. SearchSelect为受控组件

  3. SearchSelect设计为一般PC常用远程搜索需求,接口、入参、出参、出参数据结构等参数均可自定义配置

  4. 开源地址react-antd-search-select

使用方式

安装

npm i react-antd-search-select

全局配置,定义你们的通用业务字段

如果你大范围使用组件的话,非常建议你进行全局配置

// @/components/search-select.jsx
import React from 'react'
import SearchSelect from 'react-antd-search-select'
import { axios } from '@/common'
​
export default (props) => {
  return (
    <SearchSelect
      axios={axios} // 你的 axios 实例
      startSearchIndex={1} // 接口搜索起始索引
      pageSize={15} // 每页条数
      flagKeyName='code' // 判断接口返回成功失败标识字段
      flagValue={200} // 判断接口返回成功失败标识键值
      responseDataKeyName='resData' // 响应数据res.data字段
      totalRowsKeyName='totalNumber' //  响应数据,总条数字段
      responseCurrentPageName='currentPage' // // 响应数据,当前页字段
      listKeyName='tableList' // 响应数据,列表字段
      { ...props } // 局部使用会覆盖全局设置
    />
  )
}

配置会以一个优先顺序进行合并。这个顺序是:在 lib/bundle.js 找到的库的默认值,然后是实例的 全局 配置,最后是 局部 配置 。后者将优先于前者

局部使用

import SearchSelect from '@/components/search-select'
<SearchSelect
  url='/user/list.json'
  queryKeyName='useName'
  labelKeyName='useName'
  valueKeyName='useId'
/>

搜索

<SearchSelect
  url='/user/list.json' // 接口
  queryParams={{ // 设置默认搜索字段
    type: 1,
    ...
  }}
  queryKeyName='useName' // 配置搜索关键字字段
  labelKeyName='useName'
  valueKeyName='useId'
/>

多选

<SearchSelect
  url='/user/list.json' // 接口
  mode='multiple'
  max={3} // 设置最多选择数量
/>

回显

回显的策略是通过form.setFieldsValuedefaultValue设置value,因为组件是分页的,因此需要显式的传给组件回显数据项selectedOptionList

单选回显

useEffect(() => {
  form.setFieldsValue({
    userId: 405
  })
}, [])
​
<Form form={form}>
  <Form.Item name='searchSelect'>
    <SearchSelect
      url='/user/list.json'
      selectedOptionList={[
        {
          stringValue: "测试",
          text: "测试",
          value: 405
        }
      ]}
      />
  </Form.Item>
</Form>

多选回显

useEffect(() => {
  form.setFieldsValue({
    userId: [405, 397]
  })
}, [])
​
<Form form={form}>
  <Form.Item name='searchSelect'>
    <SearchSelect
      url='/user/list.json'
      mode='multiple'
      max={3}
      selectedOptionList={[
        {
          label: "测试",
          value: 405
        },{
          label: "看看",
          value: 397
        }
      ]}
      />
  </Form.Item>
</Form>

onChange

<SearchSelect
  url='/user/list.json'
  onChange={(value, row) => { // 返回选中的value和数据项
    console.log(value, row)
  }}
/>

额外的后缀label

有时候我们可能会需要在option中显示一个其他字段,如:品牌名。这里提供两种方式

1. 自定义option右侧字段

如不返回则不展示右侧额外字段。样式上一个optionlabelflex: 3extraSuffixflex: 1

<SearchSelect
  url='/goods/list.json'
  optionLabelProp='label' // 设置回填到选择框的 Option 的属性值
  extraSuffix={item => { // item为当前数据项
    return item.brandName // 返回要显示的字段
  }}
/>

2. 自定义option

row字段必须设置,为onChange时获取的数据项

<SearchSelect
  url='/goods/list.json'
  optionLabelProp='label' // 设置回填到选择框的 Option 的属性值
  renderOptions={dataList => { // dataList为下拉选数据
    return dataList.map(item => (
      <Option
        disabled={item.disabled}
        key={item.value}
        value={item.value}
        label={item.text}
        row={item} // ***此字段必须设置,为onChange时获取的数据项***
        >
        <div style={{ display: 'flex', justifyContent: 'space-between' }}>
          <span>{item.text}</span>
          <span>{item.value}</span>
        </div>
      </Option>
    ))
  }}
/>

修改接口返回数据字段、格式

组件默认的接口返回去数据结构和字段如下

{
  data: {
    curPage: 0,
    dataList: [],
    pageSize: 15,
    totalRows: 56
  },
  flag: 1
}

但是你的接口返回的数据结构和字段比不是这样,组件提供两种方式解决

结构相同,字段不一致

<SearchSelect
  url='/user/list.json'
  flagKeyName='code' // 判断接口返回成功失败标识字段,对应 flag
  flagValue={200} // 判断接口返回成功失败标识键值,对应 flag: 1
  responseDataKeyName='resData' // 响应数据res.data字段,对应 data
  totalRowsKeyName='totalNumber' //  响应数据,总条数字段,对应 totalRows
  responseCurrentPageName='currentPage' // // 响应数据,当前页字段,对应 curPage
  listKeyName='tableList' // 响应数据,列表字段,对应 dataList
/>

结构不同

比如你的接口返回数据结构如下,要转换为组件需要的数据结构和字段

{
  code: 200,
  message: 'OK',
  list: [],
  totalNumber: 100,
  current: 1
}

通过responseDataFormat修改

<SearchSelect
  url='/user/list.json'
  responseDataFormat={(resData) => { // resData为接口响应数据
    return {
      flag: resData.code === 200 ? 1 : 0,
      data: {
        totalRows: resData.totalNumber,
        curPage: resData.current,
        dataList: resData.data.list
      }
    }
  }}
/>

API

Props

属性说明默认值类型可选值版本
axiosaxios实例,使用post请求方式,必填Function
url接口,必填String
queryParams搜索参数Object
queryKeyName搜索关键字字段clickString
pageSize搜索,每页条数键值10Number|String
pageSizeKeyName搜索条件,每页条数字段pageSizeString
currentPageKeyName搜索条件,当前页字段curPageString
labelKeyNameoption label 字段labelString
valueKeyNameoption value 字段valueString
disabledKeyNameoption disabled 字段disabledString
flagKeyName判断接口返回成功失败标识字段flagString
flagValue判断接口返回成功失败标识键值1String Number Boolean Symbol
responseDataKeyName响应数据res.data字段dataString
responseCurrentPageName响应数据,当前页字段默认取currentPageKeyName值String
totalRowsKeyName响应数据,总条数字段totalRowsString
listKeyName响应数据,列表字段dataListString
allowClear支持清除trueBoolean
startSearchIndex自定义接口搜索起始索引0Number|String
qsStringify是否使用qs模块序列化参数falseBoolean
selectStyleselect样式Object
extraSuffix额外的后缀labelFunction
selectedOptionList回显数据,需要配合form.setFieldsValue才能回显成功[]Array
max最多选择数量,只在 mode 为 multiple 或 tags 时有效999Number
lang选择数量超过max值时的提示语国际化类型zhStringzh en es ja
renderOptions自定义optionFunction
responseDataFormat修改接口返回数据Function
requestFail请求失败后的回调,参数为接口响应数据Function1.0.2

Antd Select API

Antd Select被组件占用的且无法修改的props,其他都可用

PropTypes.node
showSearch
loading
notFoundContent
getPopupContainer
dropdownRender
onSearch
filterOption
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

__畫戟__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值