显示一个选项列表供用户选择,通过按钮触发。
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 部分以获得最佳的用户体验。如果您不想使用这些部分,请使用我们的 Scroll Area 原始组件组合您的选择组件。
有关更多信息,请参阅 W3C Select-Only Combobox 示例。
使用我们的 Label 组件,以便为选择组件提供可视化且可访问的标签。
通过将原始组件部分抽象到您自己的组件中来创建您自己的 API。
此示例抽象了大部分部分。