¥Select
显示一个选项列表,供用户选择 - 由按钮触发。
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;
Can be controlled or uncontrolled.
Offers 2 positioning modes.
Supports items, labels, groups of items.
Focus is fully managed.
Full keyboard navigation.
Supports custom placeholder.
Typeahead support.
Supports Right to Left direction.
¥Installation
从命令行安装组件。
¥Install the component from your command line.
¥Anatomy
导入所有部分并将它们组合在一起。
¥Import all parts and piece them together.
¥API Reference
¥Root
包含选择框的所有部分。
¥Contains all the parts of a select.
¥Trigger
切换选择按钮。Select.Content
将通过对齐触发器进行自我定位。
¥The button that toggles the select. The Select.Content
will position itself by aligning over the trigger.
¥Value
反映所选值的部分。默认情况下,将渲染所选项目的文本。如果你需要更多控制,你可以控制选择并传递你自己的 children
。它不应该被设计成确保正确定位的样式。当 select 没有值时,也可以使用可选的 placeholder
属性。
¥The part that reflects the selected value. By default the selected item's text will be rendered. if you require more control, you can instead control the select and pass your own children
. It should not be styled to ensure correct positioning. An optional placeholder
prop is also available for when the select has no value.
¥Icon
一个小图标,通常显示在值旁边,作为可打开值的视觉提示。默认情况下渲染 ▼,但你可以通过 asChild
使用自己的图标,或使用 children
。
¥A small icon often displayed next to the value as a visual affordance for the fact it can be open. By default renders ▼ but you can use your own icon via asChild
or use children
.
¥Portal
使用时,将内容部分传送到 body
中。
¥When used, portals the content part into the body
.
¥Content
选择框打开时弹出的组件。
¥The component that pops out when the select is open.
¥Viewport
包含所有项目的滚动视口。
¥The scrolling viewport that contains all of the items.
¥Item
包含选择项的组件。
¥The component that contains the select items.
项目的文本部分。它应该只包含你希望在选择该项目时在触发器中看到的文本。它不应该被设计成确保正确定位的样式。
¥The textual part of the item. It should only contain the text you want to see in the trigger when that item is selected. It should not be styled to ensure correct positioning.
当项目被选中时渲染。你可以直接设置此元素的样式,也可以将其用作封装器来放置图标,或者两者兼而有之。
¥Renders when the item is selected. You can style this element directly, or you can use it as a wrapper to put an icon into, or both.
一个可选的按钮,用作显示视口溢出的功能,并在功能上支持向上滚动。
¥An optional button used as an affordance to show the viewport overflow as well as functionaly enable scrolling upwards.
一个可选的按钮,用作显示视口溢出的功能,并在功能上支持向下滚动。
¥An optional button used as an affordance to show the viewport overflow as well as functionaly enable scrolling downwards.
¥Group
用于对多个项目进行分组。与 Select.Label
结合使用,通过自动标记确保良好的可访问性。
¥Used to group multiple items. use in conjunction with Select.Label
to ensure good accessibility via automatic labelling.
¥Label
用于渲染组的标签。它无法通过方向键获得焦点。
¥Used to render the label of a group. It won't be focusable using arrow keys.
¥Separator
用于在选择框中以视觉方式分隔项目。
¥Used to visually separate items in the select.
¥Arrow
一个可选的箭头元素,用于与内容一起渲染。这可以用来帮助在视觉上将触发器与 Select.Content
链接起来。必须在 Select.Content
中渲染。仅在 position
设置为 popper
时可用。
¥An optional arrow element to render alongside the content. This can be used to help visually link the trigger with the Select.Content
. Must be rendered inside Select.Content
. Only available when position
is set to popper
.
¥Examples
¥Change the positioning mode
默认情况下,Select
的行为类似于原生 MacOS 菜单,Select.Content
相对于活动项目进行定位。如果你更喜欢类似于 Popover
或 DropdownMenu
的替代定位方法,则可以将 position
设置为 popper
,并使用其他对齐选项,例如 side
、sideOffset
等。
¥By default, Select
will behave similarly to a native MacOS menu by positioning Select.Content
relative to the active item. If you would prefer an alternative positioning approach similar to Popover
or DropdownMenu
then you can set position
to popper
and make use of additional alignment options such as side
, sideOffset
and more.
¥Constrain the content size
在 Select.Content
上使用 position="popper"
时,可能需要限制内容的宽度,使其与触发器宽度匹配。你可能还需要限制其高度,使其不超过视口。
¥When using position="popper"
on Select.Content
, you may want to constrain the width of the content so that it matches the trigger width. You may also want to constrain its height to not exceed the viewport.
为了支持此功能,我们公开了几个 CSS 自定义属性,例如 --radix-select-trigger-width
和 --radix-select-content-available-height
。使用它们来限制内容尺寸。
¥We expose several CSS custom properties such as --radix-select-trigger-width
and --radix-select-content-available-height
to support this. Use them to constrain the content dimensions.
¥With disabled items
你可以通过 data-disabled
属性为禁用项目添加特殊样式。
¥You can add special styles to disabled items via the data-disabled
attribute.
¥With a placeholder
当选择项没有值时,你可以在 Value
上使用 placeholder
属性。Trigger
元素上还有一个 data-placeholder
属性,可用于设置样式。
¥You can use the placeholder
prop on Value
for when the select has no value. There's also a data-placeholder
attribute on Trigger
to help with styling.
¥With separators
使用 Separator
组件在项目之间添加分隔符。
¥Use the Separator
part to add a separator between items.
¥With grouped items
使用 Group
和 Label
部件将项目分组到一个部分中。
¥Use the Group
and Label
parts to group items in a section.
¥With complex items
你可以在项目中使用自定义内容。
¥You can use custom content in your items.
¥Controlling the value displayed in the trigger
默认情况下,触发器将自动显示所选项目 ItemText
的内容。你可以通过选择将内容放置在 ItemText
部分的内部/外部来控制显示的内容。
¥By default the trigger will automatically display the selected item ItemText
's content. You can control what appears by chosing to put things inside/outside the ItemText
part.
如果你需要更大的灵活性,你可以使用 value
/onValueChange
属性来控制组件,并将 children
传递给 SelectValue
。请务必确保你在其中输入的内容可访问。
¥If you need more flexibility, you can control the component using value
/onValueChange
props and passing children
to SelectValue
. Remember to make sure what you put in there is accessible.
¥With custom scrollbar
原生滚动条默认隐藏,因为我们建议使用 ScrollUpButton
和 ScrollDownButton
部分以获得最佳用户体验。如果你不想使用这些部分,请使用我们的 滚动区域 基础组件组合你的选择。
¥The native scrollbar is hidden by default as we recommend using the ScrollUpButton
and ScrollDownButton
parts for the best UX. If you do not want to use these parts, compose your select with our Scroll Area primitive.
¥Accessibility
¥Adheres to the ListBox WAI-ARIA design pattern.
有关更多信息,请参阅 W3C 仅选择组合框 示例。
¥See the W3C Select-Only Combobox example for more information.
¥Keyboard Interactions
¥Labelling
使用我们的 标签 组件为选择项提供可视化且易于访问的标签。
¥Use our Label component in order to offer a visual and accessible label for the select.
¥Custom APIs
通过将原始部分抽象到你自己的组件中来创建你自己的 API。
¥Create your own API by abstracting the primitive parts into your own component.
Select
和 SelectItem
¥Abstract down to Select
and SelectItem
此示例抽象了大部分部分。
¥This example abstracts most of the parts.
¥Usage
¥Implementation