antd 的select 使用时,输入内容筛选出含有输入内容的选项

在antd 的select使用时,对于选项过多时可以进行优化,输入内容筛选出符合的选项,为了工作中方便使用,便对select作出了进一步封装,
封装的组件:

import React, { useState, useEffect, forwardRef, useImperativeHandle } from 'react'
import { Select } from 'antd'

const { Option } = Select

interface SelectProps {
  values: string //可传入的值
  onChange: (value: string) => void//回掉方法
  options: any[] //选项
  disabled?: boolean//是否禁用
}

const SearchComponent: React.ForwardRefRenderFunction<any, SelectProps> = (
  { values, onChange, options, disabled, ...rest },
  ref,
) => {
  const [selectedValue, setSelectedValue] = useState<string | undefined>(values)
  const [selectList, setSelectedList] = useState<any[]>(options)

  useEffect(() => {
    setSelectedValue(values)
    setSelectedList(options)
  }, [values, options])

  const handleChange = (value: string) => {
    setSelectedValue(value)
    onChange(value)
  }

  const handleSearch = (value: string) => {
    let newList: any[] = []
    if (!value) {
      newList = [...options]
    } else {
      newList = options.filter((item: any) => item.label.includes(value))
    }
    setSelectedList(newList)
  }

  // 暴露给父组件的方法
  useImperativeHandle(ref, () => ({
    clearSelection() {
      setSelectedValue(undefined)
      onChange('')
    },
  }))
  const calculateOptionWidth = (label: string) => {
    // 根据具体需求编写计算逻辑
    // 这里简单示例为每个汉字设置 12px 的宽度
    return label.length * 12
  }
  return (
    <Select
      allowClear
      value={selectedValue}
      style={{ width: '100%' }}
      showSearch
      showArrow={false}
      defaultActiveFirstOption={false}
      filterOption={false}
      onSearch={handleSearch}
      onChange={handleChange}
      notFoundContent={null}
      disabled={disabled}
      {...rest}
    >
      {!selectList
        ? null
        : selectList.map((item: any, index: number) => (
            //@ts-ignore
            <Option key={index} value={item.value} style={{ width: calculateOptionWidth(item.label) }}>
              {item.label}
            </Option>
          ))}
    </Select>
  )
}

export default forwardRef(SearchComponent)

对于组件的调用

<SearchComponent 
  options={[]} 
  values={dataSourceValue} 
  onChange={dataSourceCall} 
  />

options是父组件传入的选择项
values 是父组件中对应的值
onChange父组件与组件之间的对于values的传递,

各位看的大哥,轻点喷,若有问题,请指出 ,互相交流

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值