显示一个选项列表供用户选择——由一个按钮触发。
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此示例抽象了大部分部分。