antd设置select支持输入和选择功能

本文介绍如何使用Ant Design (AntD) 的Select组件实现支持输入和搜索的功能,并提供了一个封装好的示例代码。该组件允许用户通过输入进行选项过滤,并支持自定义图标及清除选项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这是我封装的一个select代码,直接拿过去就可以用了

import React, { MutableRefObject } from 'react'
import { Select } from 'antd';
import { UserOutlined } from '@ant-design/icons';

const { Option } = Select;

export interface SelectProps {
  value: string;
  setSearchOpt: any[];
  onChangeHandl: (value: any) => void;
  onSearch: (value: any) => void;
  valueRef: MutableRefObject<{ value: string; }>
  formSetValue: (value: string) => void;
  onClear: () => void;
}

const SelectSearch: React.FC<SelectProps> = (props) => {
  return <>
    <Select
      showSearch // 使用单选模式可搜索
      value={props.value} // 选中当前条目,多选返回数组
      placeholder={''} // select默认展示的说明
      defaultActiveFirstOption={false} // 是否默认高亮第一个选项
      filterOption={false} // 是否根据输入项进行筛选
      onSearch={props.onSearch} // “文本框值”变化时的回调
      onChange={props.onChangeHandl} // 选中option,或input的value回调
      notFoundContent={null} // 当下拉列表为空时,显示的内容
      allowClear // 是否支持清除
      suffixIcon={<UserOutlined />} // 自定义的选择框后缀的图标
      onBlur={() => {
        console.log(props)
        // props.valueRef.current.value
        props.formSetValue('')
      }}
      onClear={props.onClear}
    >
      {
        props.setSearchOpt.map((item: any) => {
          return <Option key={item.value} value={item.value}>{item.name}</Option>
        })
      }
    </Select>
  </>
}

export default SelectSearch

使用:
注:实际上我项目中我针对表单的Form.item是做了封装的,所以以下示例针对看我博客的朋友能更快速的理解,所以做了简化的示例,如有不到之处,可以指出,我会进行说明修改的。

/**
 * 使用select组件页面
 */
import { Form } from 'antd'
import SelectSearch from './SelectSearch'
import { useRef, useState } from 'react'
/**
 * 模拟数据
 */
const data = [
  {
    value: 1,
    name: 'aaa'
  },
  {
    value: 2,
    name: 'bbb'
  },
  {
    value: 3,
    name: 'ccc'
  },
]

const UseSelect: React.FC = () => {

  // 这个是在失去焦点后,select框内的数据就会消失,value就是空,select框无数据,所以这个最后通过form设置值的方法来解决这个问题
  const valueRef = useRef({ value: '' })

  const [searchOpt, setSearchOpt] = useState(data)

  const [searchVal, setSearchVal] = useState('')
  const [form] = Form.useForm()

  const formSetValue = (value?: string) => {
    if(value) {
      valueRef.current.value = value
    }
    console.log(valueRef.current.value)
    form.setFieldsValue({username: valueRef.current.value})
    setSearchVal(valueRef.current.value) // 这个是进行select输入信息后进行回显的
  }

  /**
   * 清除select
   */
  const onClear = () => {
    console.log('is clear here?')
    form.resetFields();
    valueRef.current.value = ''
    formSetValue()
  }

  return <>
      <Form form={form} name="dynamic_rule">
        <Form.Item
          name="username"
          label="Name"
          rules={[
            {
              required: true,
              message: 'Please input your name',
            },
          ]}
        >
          <SelectSearch
            value={searchVal}
            setSearchOpt={searchOpt}
            valueRef={valueRef}
            onChangeHandl={(value: any)=> {
              const findData = data.find(item => item.value === value)?.name || ''
              formSetValue(findData)

            }}
            onSearch={(value: any) => { // 需要搜索时输入的内容
              formSetValue(value || '')

              setSearchOpt((item) => item.filter(ele => ele.name.includes(value))) // 我的功能需求:用户在这里输入信息后,需要调接口进行进行获取Option内容的数据
            }}
            formSetValue={formSetValue}
            onClear={onClear}
          />
        </Form.Item>
      </Form>
  </>
}

export default UseSelect
### 实现 Ant Design Select 组件的支持输入选择功能 为了使 Ant Design 的 `Select` 组件能够支持输入以及选择操作,可以利用组件内置属性来增强用户体验。具体来说,通过设置特定的属性可以让用户不仅限于从下拉列表中选择选项,还可以手动输入内容。 #### 使用 `showSearch` 属性启用搜索功能 当希望允许用户在 `Select` 中进行筛选时,可以通过开启 `showSearch` 属性实现这一目的。这使得用户可以在输入框内键入字符以快速定位到目标项: ```jsx import { Select } from 'antd'; const { Option } = Select; function App() { return ( <Select showSearch placeholder="请选择输入"> <Option value="apple">Apple</Option> <Option value="banana">Banana</Option> <Option value="orange">Orange</Option> </Select> ); } ``` 此配置让用户既可以选择预定义好的项目,也可以尝试输入自定义文本[^1]。 #### 结合 `filterOption` 方法优化匹配逻辑 为了让用户的输入更加灵活有效率,在启用了 `showSearch` 后通常还会配合使用 `filterOption` 函数来自定义过滤规则。该函数接收两个参数——一个是用于比较的关键字字符串;另一个则是当前遍历到的数据对象。返回布尔值决定该项是否显示给用户作为候选结果之一: ```jsx <Select showSearch filterOption={(input, option) => option.children.toLowerCase().indexOf(input.toLowerCase()) >= 0 } placeholder="请输入水果名称" > {/* Options here */} </Select> ``` 上述代码片段展示了如何基于简单的子串查找方式来进行模糊查询处理。 #### 处理异步加载数据场景下的应用 如果面对的是远程获取动态更新的数据源,则需考虑采用更复杂的模式如 `async/await` 或者回调机制去延迟渲染待选条目直到实际取得最新资料为止。此时可借助 `loading` `notFoundContent` 这样的辅助状态提示信息给前端使用者知道现在正处于等待阶段或是未找到任何符合条件的结果。 对于需要实时反馈的情况,建议监听 `onSearch` 事件并据此触发相应的网络请求动作,从而确保每次键盘交互都能及时响应最新的变化趋势。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值