Skyroc UI
输入

Select

用于从下拉列表中选择单个值的选择器

Select 用于在有限选项中选择一个值。组件基于 Radix Select 封装,支持数据驱动的选项、分组、分隔线、禁用项、自定义图标、尺寸和弹层位置。

import {
  Select,
  SelectContent,
  SelectItem,
  SelectLabel,
  SelectSeparator,
  SelectTrigger
} from '@skyroc/web-ui';

何时使用

  • 需要从一组选项中选择一个值,并希望节省页面空间。
  • 选项数量中等,适合收纳到弹层中展示。
  • 需要分组、分隔线、禁用选项或自定义选项内容。
  • 少量选项且需要直接展示时使用 Radio 或 Segment;需要搜索过滤时使用 Combobox。

基础用法

通过 items 渲染选项,使用 triggerProps.placeholder 设置占位文案。

Preview
Code
Loading...
<Select
  items={[
    { label: 'Apple', value: 'apple' },
    { label: 'Banana', value: 'banana' }
  ]}
  triggerProps={{ placeholder: 'Please select a fruit' }}
/>

受控模式

使用 valueonValueChange 控制当前选中值。

Preview
Code
Loading...
const [value, setValue] = useState('apple');

<Select
  items={items}
  onValueChange={setValue}
  value={value}
/>

默认值

使用 defaultValue 设置非受控模式下的默认选中项。

Preview
Code
Loading...
<Select
  defaultValue="cherry"
  items={items}
/>

分组选项

选项数据可以通过 children 组织为分组。分组的 label 会渲染为组标题,children 内部渲染普通选项。

Preview
Code
Loading...
<Select
  items={[
    {
      label: 'Fruits',
      children: [
        { label: 'Apple', value: 'apple' },
        { label: 'Banana', value: 'banana' }
      ]
    }
  ]}
/>

分隔线

items 中插入 { type: 'separator' } 可以渲染分隔线,用于区分不同选项区域。

Preview
Code
Loading...
<Select
  items={[
    { label: 'Apple', value: 'apple' },
    { type: 'separator' },
    { label: 'Banana', value: 'banana' }
  ]}
/>

弹层位置

默认 contentProps.positionpopper,弹层会基于触发器尺寸和位置渲染。设置为 item-aligned 可以使用 Radix 的选项对齐模式。

Preview
Code
Loading...
<Select
  contentProps={{ position: 'item-aligned' }}
  items={items}
/>

尺寸

通过 size 调整触发器、弹层、选项和分隔线尺寸,从 xs2xl 共 6 个尺寸。

Preview
Code
Loading...
尺寸适用场景
xs表格、紧凑筛选器
sm小型表单
md常规表单(默认)
lg设置页表单
xl强调型选择区域
2xl大尺寸展示或触控区

自定义样式

通过 classNames 覆盖内部 slot。常用 slot 包括 triggercontentitemgroupLabelseparator

Preview
Code
Loading...
<Select
  classNames={{
    content: 'border-primary/30',
    item: 'focus:bg-primary/10',
    trigger: 'border-primary/40'
  }}
  items={items}
/>

禁用

可以禁用整个 Select,也可以在单个 item 上设置 disabled 禁用部分选项。

Preview
Code
Loading...
<Select disabled items={items} />
Preview
Code
Loading...
<Select
  items={[
    { label: 'Apple', value: 'apple' },
    { disabled: true, label: 'Banana', value: 'banana' }
  ]}
/>

API

Select

主组件基于 Radix Select Root,使用 items 数据渲染 Trigger、Content 和 Option。

属性说明类型默认值
items*下拉选项数据,支持普通项、分组和分隔线SelectOptionData[]-
value受控模式下当前选中的值string-
defaultValue非受控模式下默认选中的值string-
onValueChange选中值变化时触发(value: string) => void-
open受控模式下弹层是否打开boolean-
defaultOpen非受控模式下弹层默认是否打开boolean-
onOpenChange弹层打开状态变化时触发(open: boolean) => void-
disabled是否禁用整个 Selectboolean-
size尺寸,影响触发器、弹层和选项'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl''md'
indicatorIcon选中项指示器图标ReactNode-
classNameRoot classClassValue-
classNames各 slot 的自定义 classSelectClassNames-
triggerProps传递给 SelectTrigger 的额外 propsSelectTriggerProps-
contentProps传递给 SelectContent 的额外 propsOmit<SelectContentProps, "children">-

结构组件

结构组件适合需要手动组合 Select,或需要完全控制 Trigger / Content / Item 结构时使用。

属性说明类型默认值
SelectTrigger打开下拉弹层的触发器SelectTriggerProps-
SelectContent下拉弹层内容容器SelectContentProps-
SelectItem单个可选项SelectItemProps-
SelectLabel分组标题SelectLabelProps-
SelectSeparator分隔线SelectSeparatorProps-
SelectOption根据 SelectOptionData 渲染 item、group 或 separator 的数据渲染组件SelectOptionProps-

类型

SelectProps

Select 主组件属性,基于 Radix Select Root,并增加数据驱动渲染和 slot 配置。

字段类型说明
itemsSelectOptionData[]下拉选项数据。
valuestring受控选中值。
defaultValuestring默认选中值。
onValueChange(value: string) => void选中值变化回调。
openboolean受控打开状态。
defaultOpenboolean默认打开状态。
onOpenChange(open: boolean) => void打开状态变化回调。
disabledboolean是否禁用。
size'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'尺寸。
indicatorIconReactNode选中项指示器图标。
classNameClassValueRoot class。
classNamesSelectClassNamesslot class 配置。
triggerPropsSelectTriggerProps触发器属性。
contentPropsOmit<SelectContentProps, "children">弹层内容属性。

SelectClassNames

Select 各 slot 的自定义 class。

字段类型说明
contentClassValue弹层内容容器 class。
groupClassValue分组容器 class。
groupLabelClassValue分组标题 class。
itemClassValue选项 class。
itemIndicatorClassValue选中指示器 class。
itemTextClassValue选项文本 class。
scrollDownButtonClassValue向下滚动按钮 class。
scrollUpButtonClassValue向上滚动按钮 class。
selectedValueClassValue触发器当前值 class。
separatorClassValue分隔线 class。
triggerClassValue触发器 class。
triggerIconClassValue触发器图标 class。
viewportClassValue弹层视口 class。

SelectOptionItemData

普通选项数据。继承 SelectItemProps,但用 label 表示显示内容。

字段类型说明
valuestring选项值。
labelReactNode选项显示内容。
type'item'选项类型标识,可省略。
disabledboolean是否禁用当前选项。
leadingReactNode前置内容。
trailingReactNode后置内容。
indicatorIconReactNode当前选项的选中指示器图标。
classNameClassValue选项 class。
classNamesPick<SelectClassNames, 'item' | 'itemIndicator' | 'itemText'>选项相关 slot class。

SelectGroupOptionData

分组选项数据。

字段类型说明
type'group'分组类型标识,可省略。
labelReactNode分组标题。
childrenSelectOptionItemData[]分组内选项。
classNameClassValue分组标题 class。

SelectSeparatorOptionData

分隔线选项数据。

字段类型说明
type'separator'分隔线类型标识。
classNameClassValue分隔线 class。

SelectTriggerProps

触发器属性,基于 Radix Select Trigger 和 Value。

字段类型说明
childrenReactNode自定义当前值渲染内容。
placeholderReactNode未选择时的占位内容。
triggerIconReactNode触发器图标。
leadingReactNode前置内容。
trailingReactNode后置内容。
disabledboolean是否禁用触发器。
size'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'触发器尺寸。
classNameClassValue触发器 class。
classNamesPick<SelectClassNames, 'selectedValue' | 'trigger' | 'triggerIcon'>触发器相关 slot class。

SelectContentProps

弹层内容属性,基于 Radix Select Content。

字段类型说明
childrenReactNode弹层内容。
position'popper' | 'item-aligned'弹层定位模式。
side'top' | 'right' | 'bottom' | 'left'弹层出现方向。
align'start' | 'center' | 'end'弹层对齐方式。
sideOffsetnumber弹层与触发器的距离。
size'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'弹层尺寸。
scrollUpButtonReactNode向上滚动按钮内容。
scrollDownButtonReactNode向下滚动按钮内容。
classNameClassValue弹层内容 class。
classNamesPick<SelectClassNames, 'content' | 'scrollDownButton' | 'scrollUpButton' | 'viewport'>弹层相关 slot class。

SelectItemProps

单个选项属性,基于 Radix Select Item,并增加前后置内容和指示器图标。

字段类型说明
valuestring选项值。
childrenReactNode选项内容。
disabledboolean是否禁用选项。
textValuestring用于无障碍和类型选择的文本值。
leadingReactNode前置内容。
trailingReactNode后置内容。
indicatorIconReactNode选中指示器图标。
size'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'选项尺寸。
classNameClassValue选项 class。
classNamesPick<SelectClassNames, 'item' | 'itemIndicator' | 'itemText'>选项相关 slot class。

SelectLabelProps

分组标题属性,基于 Radix Select Label。

字段类型说明
childrenReactNode标题内容。
size'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'标题尺寸。
classNameClassValue标题 class。

SelectSeparatorProps

分隔线属性,基于 Radix Select Separator。

字段类型说明
size'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'分隔线尺寸。
classNameClassValue分隔线 class。

SelectOptionProps

数据渲染组件属性,用于根据 SelectOptionData 渲染普通项、分组或分隔线。

字段类型说明
itemSelectOptionData待渲染的选项数据。
size'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'选项尺寸。
indicatorIconReactNode选中指示器图标。
classNamesSelectClassNamesslot class 配置。

SelectOptionData

Select items 中可使用的选项数据联合类型

ClassValue

CSS 类名类型

string | null | undefined | Record<string, boolean> | ClassValue[]

On this page