Skip to content

Select

Select 用于在有限候选项中选择单个值。组件基于 Radix Select 封装,保留组合式 API,并统一支持 classNameclassstyle 与本库 sx 样式系统。

Basic

最小用法由 SelectSelectTriggerSelectValueSelectContent 和选项组成。常规业务表单推荐使用 SelectItems 从配置生成选项,便于复用选项数据和禁用状态。

常见场景

受控选择

当选中值需要驱动筛选、查询或联动表单时,使用 valueonValueChange 管理状态。SelectValue 只负责显示当前选项或占位文案,不接管业务状态。

分组与分隔线

复杂选项可以直接使用组合式 API。SelectGroup 管理语义分组,SelectLabel 渲染不可选择的分组标题,SelectSeparator 用于分隔选项区域。

禁用与样式

Select disabled 会禁用整组选择;单个选项的禁用状态通过 SelectItem disabledSelectOption.disabled 设置。根组件以外的触发器、弹层、选项、分组标题、分隔线和滚动按钮都支持 sx

页面滚动策略

Select 默认允许页面在弹层打开时继续滚动,适合筛选栏、详情页表单和长页面中的内联选择。需要恢复打开弹层时锁定页面滚动的行为时,设置 lockScroll

Usage

tsx
import {
  Select,
  SelectContent,
  SelectItems,
  SelectTrigger,
  SelectValue,
} from "@ldkj/web-ui";

const options = [
  { label: "全部状态", value: "all" },
  { label: "待处理", value: "pending" },
  { label: "处理中", value: "processing" },
  { label: "已完成", value: "done" },
];

export function Example() {
  return (
    <Select defaultValue="all">
      <SelectTrigger className="w-64" aria-label="订单状态">
        <SelectValue placeholder="请选择订单状态" />
      </SelectTrigger>
      <SelectContent>
        <SelectItems options={options} />
      </SelectContent>
    </Select>
  );
}

组合式用法:

tsx
import {
  Select,
  SelectContent,
  SelectGroup,
  SelectItem,
  SelectLabel,
  SelectSeparator,
  SelectTrigger,
  SelectValue,
} from "@ldkj/web-ui";

export function ComposeExample() {
  return (
    <Select defaultValue="wechat">
      <SelectTrigger className="w-72" aria-label="通知渠道">
        <SelectValue placeholder="请选择通知渠道" />
      </SelectTrigger>
      <SelectContent>
        <SelectGroup>
          <SelectLabel>即时通知</SelectLabel>
          <SelectItem value="sms">短信</SelectItem>
          <SelectItem value="wechat">企业微信</SelectItem>
        </SelectGroup>
        <SelectSeparator />
        <SelectGroup>
          <SelectLabel>异步通知</SelectLabel>
          <SelectItem value="email">邮件</SelectItem>
          <SelectItem value="message">站内信</SelectItem>
        </SelectGroup>
      </SelectContent>
    </Select>
  );
}

API

Exports

  • Select
  • SelectGroup
  • SelectValue
  • SelectTrigger
  • SelectContent
  • SelectLabel
  • SelectItem
  • SelectSeparator
  • SelectScrollUpButton
  • SelectScrollDownButton
  • SelectItems
  • SelectOption(类型)
  • SelectOptionGroup(类型)
  • SelectProps(类型)

Select

属性说明类型默认值
value受控值string-
defaultValue默认值string-
onValueChange值变化回调(value: string) => void-
open受控打开状态boolean-
defaultOpen默认打开状态booleanfalse
onOpenChange打开状态变化回调(open: boolean) => void-
disabled是否禁用整组booleanfalse
name表单字段名string-
required是否必填booleanfalse
dir文本方向"ltr" | "rtl"-
lockScroll弹层打开时是否锁定页面滚动booleanfalse

其余属性继承 Radix Select.Root

SelectTrigger

属性说明类型默认值
children触发器内容React.ReactNode-
className自定义类名string-
class类名别名string-
style原生样式React.CSSProperties-
sxCSS-in-JS 样式入口SxProps-

其余属性继承 Radix Select.Trigger

SelectContent

属性说明类型默认值
positionRadix 定位模式"item-aligned" | "popper""popper"
side弹层方向"top" | "right" | "bottom" | "left"-
align弹层对齐"start" | "center" | "end"-
sideOffset弹层与触发器间距number-
collisionPadding碰撞检测边距number | { top?: number; right?: number; bottom?: number; left?: number }-
className自定义类名string-
class类名别名string-
style原生样式React.CSSProperties-
sxCSS-in-JS 样式入口SxProps-

其余属性继承 Radix Select.Content

SelectItem

属性说明类型默认值
value选项值,必须是非空字符串string-
disabled是否禁用该选项booleanfalse
textValue文本值,用于键盘搜索和无障碍读法string-
className自定义类名string-
class类名别名string-
style原生样式React.CSSProperties-
sxCSS-in-JS 样式入口SxProps-

其余属性继承 Radix Select.Item

SelectLabel

属性说明类型默认值
children分组标题内容React.ReactNode-
className自定义类名string-
class类名别名string-
style原生样式React.CSSProperties-
sxCSS-in-JS 样式入口SxProps-

其余属性继承 Radix Select.Label

SelectSeparator

属性说明类型默认值
className自定义类名string-
class类名别名string-
style原生样式React.CSSProperties-
sxCSS-in-JS 样式入口SxProps-

其余属性继承 Radix Select.Separator

SelectScrollUpButton / SelectScrollDownButton

属性说明类型默认值
className自定义类名string-
class类名别名string-
style原生样式React.CSSProperties-
sxCSS-in-JS 样式入口SxProps-

其余属性继承 Radix 对应滚动按钮组件属性。

SelectGroup / SelectValue

  • SelectGroup 继承 Radix Select.Group
  • SelectValue 继承 Radix Select.Value,常用属性包括 placeholderaria-label

SelectItems

属性说明类型默认值
options选项或分组选项列表(SelectOption | SelectOptionGroup)[]-
itemProps透传给每个 SelectItemSelectItemProps-
labelProps透传给每个 SelectLabelSelectLabelProps-
separatorProps透传给分组分隔线SelectSeparatorProps-

SelectOption

属性说明类型默认值
label选项显示内容React.ReactNode-
value选项值string-
disabled是否禁用该选项booleanfalse
textValue文本值,用于键盘搜索和无障碍读法string-
className自定义类名string-
class类名别名string-
style原生样式React.CSSProperties-
sxCSS-in-JS 样式入口SxProps-

SelectOptionGroup

属性说明类型默认值
label分组标题React.ReactNode-
options分组选项SelectOption[]-
separator分组末尾是否渲染分隔线booleanfalse

行为规则 / 优先级

  1. 值状态遵循 React 常规受控规则:传入 value 时由外部状态决定当前值;未传入 value 时使用内部状态,并可通过 defaultValue 设置初始值。
  2. 打开状态同样支持受控和非受控:open 优先于内部打开状态;defaultOpen 只作为非受控初始值。
  3. SelectItems 只是渲染工具,不会接管 Select 的值状态、打开状态或表单提交行为。
  4. SelectOption 上的 classNameclassstylesx 会与 itemProps 合并;单个选项的样式在合并时靠后,适合覆盖通用项样式。
  5. lockScroll=false 时,弹层打开后页面仍可滚动;lockScroll=true 时保留 Radix Select 的滚动锁定行为。
  6. SelectContent 默认通过 Portal 渲染到页面末端,并使用 position="popper" 按触发器宽度设置最小宽度。

Notes

  • SelectItem 必须提供非空字符串 value。清空或占位状态应通过业务状态和 SelectValue placeholder 表达。
  • SelectValueSelectGroup 等子组件保留 Radix 原始语义,可与 SelectItems 混用。
  • 触发器需要可访问名称。没有可见表单标签时,应给 SelectTrigger 设置 aria-label
  • 自定义复杂选项时建议提供 textValue,保证键盘搜索和读屏文本稳定。
  • 长列表会在内容区域内滚动,并按需显示 SelectScrollUpButton / SelectScrollDownButton
  • 选项数量很多、需要远程搜索或自由输入时,优先使用 AutoComplete,不要把大量动态结果塞进 Select
  • 弹层样式请优先加在 SelectContent 上;触发器样式请加在 SelectTrigger 上,避免根组件承担视觉样式。