JGuang

选择器

Select · Arco Design

交互预览
npm install @arco-design/web-react@2.66.18

选择器 Select

当用户需要从一组同类数据中选择一个或多个时,可以使用下拉选择器,点击后选择对应项。

安装

npm install @arco-design/web-react@2.66.18

在入口引入 @arco-design/web-react/dist/css/arco.css,用 ConfigProvider 设置语言。React 19 项目还需在入口最先引入 @arco-design/web-react/es/_util/react-19-adapter,否则 Message、Modal 等命令式 API 无法渲染。

示例

  • 基础用法:基础选择器。
  • 允许清除:支持清除按钮。
  • 多选模式:指定 mode=multiple,即可使用多选。通过 maxTagCount 设置最多显示的标签个数,通过 renderTag 属性自定义标签的渲染方式,实现更复杂的定制。
  • 带有前置标签:通过 addBefore 设置前置标签 (2.41.0)
  • 允许创建:指定 allowCreate 为 true,即可创建选项中不存在的条目。通过 allowCreate.formatter 格式化用户创建的选项。
  • 搜索:指定showSearch=true,可以对展开的选项进行搜索,配合 filterOption 可以自定义搜索。 搜索框聚焦时默认会清空已输入的内容,通过指定 showSearch={ retainInputValue: true } 来保留内容。
  • 远程搜索:指定 showSearch,并且结合 filterOption 和 onSearch,可以使用远程搜索功能。
  • 自定义弹出框宽度:这个例子展示了弹出框可以根据内容自动调节宽度,最小宽度为输入框的宽度。 triggerProps.autoAlignPopupWidth 参数为弹出框宽度跟输入框保持一致。 triggerProps.autoAlignPopupMinWidth 参数为弹出框最小宽度跟输入框保持一致。 可以自由组合。
  • 不同尺寸:通过 size 选择 Select 的尺寸(mini, small, default, large),高度分别对应24px、28px、32px、36px。
  • 定制回显内容:使用 renderFormat 可以定制回显内容。 注意:在如远程加载选项数据的场景下,value 中对应的选项可能在某些时刻并不存在,需要判断若 option 不存在则返回 value 作为显示的内容。
  • 分组:使用 Select.Group 对下拉菜单选项进行编组。
  • 指定可选项:通过传入options指定可选项。
  • 滚动加载选项:当动态加载时,可通过onPopupScroll来监听滚动事件
  • 自动分词:设置 tokenSeparators 可以使用自动分词功能。试试复制 Beijing,Shanghai,Shenzhen|Nanjing/Xi'an|Hangzhou 到输入框里。只在 multiple 模式下可用。
  • 自定义触发节点:设置 triggerElement 可以自定义触发下拉框的节点。当自定义了触发节点时,由于内部绑定的键盘处理事件失效,所以快捷键操作将不可用,需要通过组件引用的 hotkeyHandler 进行额外处理。
  • 扩展菜单:使用 dropdownRender 对下拉菜单进行自由扩展。
  • 无边框:使用 bordered = false,可以使用无边框的选择器。
  • 自定义标签样式:指定 renderTag 来自定义标签节点。
  • 联动:省市联动示例。
  • 隐藏已选择项:在下拉列表中隐藏已选择的项。
  • 大数据:Select 使用了虚拟滚动技术,在大量数据的情况也能保证性能。 当指定了 triggerProps.autoAlignPopupWidth = false 且 Option.label 为非文本类型时,由于无法在选项列表首次渲染时获取选项的最大宽度,虚拟滚动会被自动关闭。
  • 拖拽排序:多选时,指定 dragToSort 属性以允许对已输入的值进行拖拽排序。
  • 宽度自适应:通过 autoWidth 属性可以设置 Select 的宽度自适应
  • 最大标签数:通过 maxTagCount 属性可以设置 Select 的最大标签数。 maxTagCount=responsive 时会根据容器尺寸动态显示标签数。因为会监听所有 Tag 及容器的尺寸变化,所以在选项较多时不建议使用,可能存在性能问题。

示例来自 Arco Design 官方仓库(MIT),固定在 npm 2.66.18 对应的提交;部分示例使用在线图片或上传地址,预览中网络请求被禁用。

API

Select

参数名描述类型默认值版本
allowClear允许清除值。boolean--
animation是否为内部标签变化添加动画。booleantrue2.15.0
bordered是否需要边框booleantrue-
defaultActiveFirstOption是否默认高亮第一个选项booleantrue-
defaultPopupVisible下拉框是否默认打开。boolean-2.14.0
disabled是否为禁用状态。boolean--
dragToSort是否可以通过拖拽为 Tag 排序boolean-2.27.0
error是否是错误状态。(废弃,下个大版本移除,使用 status='error' 替代)boolean--
labelInValue设置 onChange 回调中 value 的格式。默认是string,设置为true时候,value格式为: { label: string, value: string }boolean--
loading是否为加载状态。boolean--
popupVisible控制下拉框是否打开。boolean-2.6.0
unmountOnExit是否在隐藏的时候销毁 DOM 结构booleantrue-
inputValue输入框的值(受控模式)string--
placeholder选择框默认文字。string--
allowCreate是否允许通过输入创建新的选项。| boolean| {formatter: (inputValue: string, creating: boolean) => SelectProps['options'][number];}-2.13.0, { formatter } in 2.54.0
autoWidth设置宽度自适应。minWidth 默认为 0,maxWidth 默认为 100%| boolean| { minWidth?: CSSProperties['minWidth']; maxWidth?: CSSProperties['maxWidth'] }-2.54.0
maxTagCount最多显示多少个 tag,仅在多选或标签模式有效。设置 responsive 响应式显示标签数不建议在选项较多时使用,可能存在性能问题,| number| 'responsive'| {count: number | 'responsive';render?: (invisibleTagCount: number) => ReactNode;}-Object type in 2.37.0. responsive in 2.62.0
mode是否开启多选模式或标签模式 (tags 推荐使用 mode: multiple; allowCreate: true 替代,下一大版本将移除此模式)'multiple' | 'tags'--
size分别不同尺寸的选择器。对应 24px, 28px, 32px, 36px'mini' | 'small' | 'default' | 'large'--
status状态'error' | 'warning'-2.45.0
trigger触发方式。TriggerProps['trigger']click-
addBefore选择框前添加元素ReactNode-2.41.0
clearIconallowClear 时配置清除按钮的图标。ReactNode-2.26.0
notFoundContent没有数据时显示的内容ReactNode--
prefix前缀。ReactNode-2.11.0
suffixIcon自定义选择框后缀图标。ReactNode--
arrowIcon自定义箭头图标,设置为 null 不显示箭头图标。ReactNode | null--
className节点类名string | string[]--
defaultValue选择框的默认值string | string[] | number | number[] | LabeledValue | LabeledValue[]--
dropdownMenuClassName下拉列表的类。string | string[]--
dropdownMenuStyle下拉列表的样式。CSSProperties--
options指定可选项(| string| number| { label: ReactNode | string; value: string | number; disabled?: boolean; extra?: any })[]-extra in 2.2.0
removeIcon多选时配置选中项的删除图标。当传入null,不显示删除图标。ReactNode | null--
showSearch使单选模式可搜索,传入 { retainInputValue: true } 在搜索框聚焦时保留现有内容传入 { retainInputValueWhileSelect: true } 在多选选择时保留输入框内容。boolean | { retainInputValue?: boolean; retainInputValueWhileSelect?: boolean }--
style节点样式CSSProperties--
tokenSeparators在多选模式下自动分词的分隔符。string[]--
triggerProps可以接受所有 Trigger 的 PropsPartial<TriggerProps>--
value选择器的值(受控模式)string | string[] | number | number[] | LabeledValue | LabeledValue[]--
virtualListProps传递虚拟滚动属性。AvailableVirtualListProps-2.1.0
dropdownRender自定义弹出内容。(menu: ReactNode) => ReactNode--
filterOption是否根据输入的值筛选数据。如果传入函数的话,接收 inputValue 和 option 两个参数,当option符合筛选条件时,返回 true,反之返回 false。boolean | ((inputValue: string, option: ReactElement) => boolean)true-
getPopupContainer弹出框挂载的父节点。(node: HTMLElement) => Element--
onBlur失去焦点时的回调(e) => void--
onChange点击选择框的回调(value, option: OptionInfo | OptionInfo[]) => void--
onClear点击清除时触发,参数是当前下拉框的展开状态。(visible: boolean) => void--
onClick鼠标点击下拉框时的回调(e) => void--
onDeselect取消选中的时候触发的回调,(只在 multiple 模式下触发)。(value: string | number | LabeledValue, option: OptionInfo) => void--
onFocus获得焦点时的回调(e) => void--
onInputValueChange输入框文本改变的回调。(value: string, reason: InputValueChangeReason) => void-2.3.0
onKeyDown键盘输入时的回调(e) => void-2.40.0
onPaste输入框文本粘贴的回调。(e) => void-2.9.0
onPopupScroll下拉框的滚动监听函数,参数为滚动元素。(elem) => void--
onSearch搜索时的回调(value: string, reason: InputValueChangeReason) => void--
onSelect选中选项时触发的回调,(只在 multiple 模式下触发)。(value: string | number | LabeledValue, option: OptionInfo) => void-2.52.0
onVisibleChange下拉框收起展开时触发(visible: boolean) => void--
renderFormat定制回显内容。返回值将会显示在下拉框内。若 value 对应的 Option 不存在,则第一个参数是 null(option: OptionInfo | null, value: string | number | LabeledValue) => ReactNode--
renderTag自定义标签渲染,props 为当前标签属性,index 为当前标签的顺序,values 为所有标签的值.(props: {value: any;label: ReactNode;closable: boolean;onClose: (event) => void;},index: number,values: ObjectValueType[]) => ReactNode-index、values added in 2.15.0
triggerElement自定义触发元素。| ReactNode| ((params: { value: any; option: OptionInfo | OptionInfo[] }) => ReactNode)-() => ReactNode in 2.31.0

Select.Option

参数名描述类型默认值版本
disabled是否禁用boolean--
className节点类名string | string[]--
extra携带任意自定义数据。any-2.2.0
style节点样式CSSProperties--
value默认根据此属性值进行筛选string | number (必填)--

Select.OptGroup

参数名描述类型默认值
label组名ReactNode-
className节点类名string | string[]-
style节点样式CSSProperties-

Select Reference Type

参数名描述类型默认值版本
activeOptionValue处于悬浮态的选项的值OptionProps['value'] (必填)--
getOptionInfoByValue根据选项值获得对应的选项信息(value: OptionProps['value']) => OptionInfo (必填)--
scrollIntoView将下拉列表滚动至指定选项(value: OptionProps['value'], options?: ScrollIntoViewOptions) => void (必填)-2.46.0
domDOM 节点HTMLDivElement (必填)--
blur使选择框失焦() => void (必填)--
focus使选择框聚焦() => void (必填)--
getOptionInfoList获得选项信息的列表() => OptionInfo[] (必填)--
hotkeyHandler鼠标快捷操作的处理函数(event: KeyboardEvent) => void (必填)--

LabeledValue

export type LabeledValue = {
  value: string | number;
  label: ReactNode;
};

OptionInfo

export interface OptionInfo extends PropsWithChildren<OptionProps> {
  child?: ReactElement;
  _valid: boolean;
  _index: number;
  _origin: "children" | "options" | "userCreatedOptions" | "userCreatingOption";
}

AvailableVirtualListProps

export type AvailableVirtualListProps = Pick<
  VirtualListProps<any>,
  | "height"
  | "itemHeight"
  | "threshold"
  | "isStaticItemHeight"
  | "scrollOptions"
  | "onScroll"
  | "wrapperChild"
>;

InputValueChangeReason

// 造成输入框值改变的原因:用户输入、选中选项、选项下拉框收起、触发自动分词
export type InputValueChangeReason =
  | "manual"
  | "optionChecked"
  | "optionListHide"
  | "tokenSeparator";

ObjectValueType

export type ObjectValueType = {
  value?: any;
  label?: ReactNode;
  closable?: boolean;
};

VirtualListProps

参数名描述类型默认值
height可视区高度 (2.11.0 开始支持如 80% 的 string 类型)number200
threshold自动开启虚拟滚动的元素数量阈值,传入null以禁用虚拟滚动。number|null100
isStaticItemHeight是否为相同高度的静态元素booleantrue