显示一个选项列表供用户选择——由一个按钮触发。
import * as React from "react";import { Select } from "radix-ui";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
属性为禁用的项目添加特殊样式。
您可以在 Value
上使用 placeholder
属性,以便在选择没有值时使用。Trigger
上也有一个 data-placeholder
属性,以帮助进行样式设置。
使用 Separator
部分在项目之间添加分隔符。
使用 Group
和 Label
部分在一个部分中对项目进行分组。
您可以在项目中使用自定义内容。
默认情况下,触发器将自动显示所选项目 ItemText
的内容。您可以通过选择将内容放入/放出 ItemText
部分来控制显示的内容。
如果您需要更多灵活性,可以使用 value
/onValueChange
属性控制组件,并将 children
传递给 SelectValue
。请确保您放入的内容是可访问的。
默认情况下,原生滚动条是隐藏的,因为我们推荐使用 ScrollUpButton
和 ScrollDownButton
部分以获得最佳用户体验。如果您不想使用这些部分,请将选择与我们的 滚动区域 原语组合使用。
查看 W3C 选择仅组合框 示例以获取更多信息。
使用我们的 标签 组件为选择提供视觉和可访问的标签。
通过将原语部分抽象到自己的组件中创建自己的 API。
Select
和 SelectItem
此示例抽象了大部分部分。