显示一个选项列表供用户选择——由按钮触发。
import React from 'react';import * as Select from '@radix-ui/react-select';import classnames from 'classnames';import { CheckIcon, ChevronDownIcon, ChevronUpIcon } from '@radix-ui/react-icons';import './styles.css';const SelectDemo = () => (<Select.Root><Select.Trigger className="SelectTrigger" aria-label="Food"><Select.Value placeholder="Select a fruit…" /><Select.Icon className="SelectIcon"><ChevronDownIcon /></Select.Icon></Select.Trigger><Select.Portal><Select.Content className="SelectContent"><Select.ScrollUpButton className="SelectScrollButton"><ChevronUpIcon /></Select.ScrollUpButton><Select.Viewport className="SelectViewport"><Select.Group><Select.Label className="SelectLabel">Fruits</Select.Label><SelectItem value="apple">Apple</SelectItem><SelectItem value="banana">Banana</SelectItem><SelectItem value="blueberry">Blueberry</SelectItem><SelectItem value="grapes">Grapes</SelectItem><SelectItem value="pineapple">Pineapple</SelectItem></Select.Group><Select.Separator className="SelectSeparator" /><Select.Group><Select.Label className="SelectLabel">Vegetables</Select.Label><SelectItem value="aubergine">Aubergine</SelectItem><SelectItem value="broccoli">Broccoli</SelectItem><SelectItem value="carrot" disabled>Carrot</SelectItem><SelectItem value="courgette">Courgette</SelectItem><SelectItem value="leek">Leek</SelectItem></Select.Group><Select.Separator className="SelectSeparator" /><Select.Group><Select.Label className="SelectLabel">Meat</Select.Label><SelectItem value="beef">Beef</SelectItem><SelectItem value="chicken">Chicken</SelectItem><SelectItem value="lamb">Lamb</SelectItem><SelectItem value="pork">Pork</SelectItem></Select.Group></Select.Viewport><Select.ScrollDownButton className="SelectScrollButton"><ChevronDownIcon /></Select.ScrollDownButton></Select.Content></Select.Portal></Select.Root>);const SelectItem = React.forwardRef(({ children, className, ...props }, forwardedRef) => {return (<Select.Item className={classnames('SelectItem', className)} {...props} ref={forwardedRef}><Select.ItemText>{children}</Select.ItemText><Select.ItemIndicator className="SelectItemIndicator"><CheckIcon /></Select.ItemIndicator></Select.Item>);});export default SelectDemo;
可以是受控或非受控的。
提供 2 种定位模式。
支持项目、标签和项目组。
完全管理焦点。
完整的键盘导航。
支持自定义占位符。
支持自动完成。
支持从右到左方向。
从命令行安装组件。
导入所有部分并将其组合在一起。
包含选择的所有部分。
切换选择的按钮。 Select.Content
将通过与触发器对齐来定位自身。
反映所选值的部件。默认情况下,将渲染所选项目的文本。如果您需要更多控制,则可以改为控制选择并传递您自己的 children
。不应对其进行样式设置以确保正确的定位。当选择没有值时,还可以使用可选的 placeholder
属性。
一个小图标,通常显示在值的旁边,作为其可以打开的视觉提示。默认情况下渲染 ▼,但您可以通过 asChild
使用您自己的图标,或使用 children
。
使用时,将内容部分传送至 body
。
选择打开时弹出的组件。
包含所有项目的滚动视口。
包含选择项目的组件。
项目的文本部分。它应该只包含您希望在选择该项目时在触发器中看到的文本。不应对其进行样式设置以确保正确的位置。
项目被选中时呈现。您可以直接设置此元素的样式,也可以将其用作包装器以放入图标,或者两者兼而有之。
一个可选按钮,用作显示视口溢出以及功能性启用向上滚动的辅助手段。
一个可选按钮,用作显示视口溢出以及功能性启用向下滚动的辅助手段。
用于对多个项目进行分组。与Select.Label
结合使用,以确保通过自动标签实现良好的可访问性。
用于渲染组的标签。它不能使用箭头键聚焦。
用于在选择中视觉上分隔项目。
一个可选的箭头元素,用于与内容一起渲染。这可以用于帮助视觉上将触发器与Select.Content
关联。必须渲染在Select.Content
内部。仅当position
设置为popper
时可用。
默认情况下,Select
的行为类似于本机 MacOS 菜单,通过将Select.Content
相对于活动项目定位。如果您更喜欢类似于Popover
或DropdownMenu
的替代定位方法,则可以将position
设置为popper
,并使用其他对齐选项,如side
、sideOffset
等。
在Select.Content
上使用position="popper"
时,您可能希望约束内容的宽度以使其与触发器宽度匹配。您可能还希望约束其高度,使其不超过视口。
我们公开了一些 CSS 自定义属性,例如--radix-select-trigger-width
和--radix-select-content-available-height
来支持此功能。使用它们来约束内容尺寸。
您可以通过data-disabled
属性为禁用的项目添加特殊样式。
您可以使用placeholder
道具在Value
上,用于选择没有值时。在Trigger
上还有一个data-placeholder
属性,以帮助设置样式。
使用Separator
部分在项目之间添加分隔符。
使用Group
和Label
部分将项目分组到一个部分中。
您可以在项目中使用自定义内容。
默认情况下,触发器会自动显示所选项目ItemText
的内容。您可以通过选择将内容放入ItemText
部分的内部/外部来控制显示的内容。
如果您需要更多灵活性,您可以使用value
/onValueChange
道具控制组件,并将children
传递给SelectValue
。请务必确保您放入其中的内容是可访问的。
默认情况下,本机滚动条是隐藏的,因为我们建议使用ScrollUpButton
和ScrollDownButton
部分以获得最佳用户体验。如果您不想使用这些部分,请使用我们的滚动区域基本组件组合您的选择。
请参阅 W3C 仅选择组合框示例以了解更多信息。
使用我们的标签组件为选择提供视觉和可访问的标签。
通过将基本组件抽象到您自己的组件中来创建您自己的 API。
Select
和SelectItem
此示例抽象了大部分组件。