base-ui-react
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseBase UI React
Base UI React
Package: v1.2.0
Status: Stable (production-ready)
React: 19+
Components: 36+
@base-ui/react包: v1.2.0
状态: 稳定(可用于生产环境)
React: 19+
组件数量: 36+
@base-ui/reactInstallation
安装
bash
pnpm add @base-ui/reactRequired CSS — add to your app root to create a stacking context for portaled components:
css
#root {
isolation: isolate;
}bash
pnpm add @base-ui/react必需的CSS — 添加到应用根节点,为使用portal的组件创建堆叠上下文:
css
#root {
isolation: isolate;
}Architecture
架构
Base UI implements a compound component pattern where each component is a namespace with sub-parts. All imports use sub-path format:
tsx
import { Select } from '@base-ui/react/select';
import { Dialog } from '@base-ui/react/dialog';
import { Tooltip } from '@base-ui/react/tooltip';Base UI采用复合组件模式,每个组件都是一个包含子部件的命名空间。所有导入均使用子路径格式:
tsx
import { Select } from '@base-ui/react/select';
import { Dialog } from '@base-ui/react/dialog';
import { Tooltip } from '@base-ui/react/tooltip';Three Render Patterns
三种渲染模式
Every component supports three ways to control its rendered output:
1. Direct Children (Default) — component renders its default HTML element:
tsx
<Dialog.Trigger>Open</Dialog.Trigger>2. Render Element — pass a JSX element to the prop:
rendertsx
<Dialog.Trigger render={<a href="#">Open</a>} />3. Render Function — full control via callback receiving :
(props, state)tsx
<Dialog.Trigger render={(props, state) => <MyButton {...props} active={state.open} />} />Important: Base UI uses theprop. Never userender— that is a Radix UI concept and does not exist in Base UI.asChild
每个组件支持三种方式控制其渲染输出:
1. 直接子元素(默认) — 组件渲染其默认HTML元素:
tsx
<Dialog.Trigger>打开</Dialog.Trigger>2. 渲染元素 — 向属性传递JSX元素:
rendertsx
<Dialog.Trigger render={<a href="#">打开</a>} />3. 渲染函数 — 通过接收的回调实现完全控制:
(props, state)tsx
<Dialog.Trigger render={(props, state) => <MyButton {...props} active={state.open} />} />重要提示: Base UI使用属性。请勿使用render— 这是Radix UI的概念,Base UI中不存在该属性。asChild
Floating Components: Portal > Positioner > Popup
浮动组件:Portal > Positioner > Popup
Components like Select, Popover, Tooltip, Menu, Combobox all use the same three-layer nesting pattern for positioned overlays:
tsx
<Component.Portal> {/* Renders into document.body */}
<Component.Positioner> {/* Handles positioning relative to anchor */}
<Component.Popup> {/* The visible floating element */}
{/* content */}
</Component.Popup>
</Component.Positioner>
</Component.Portal>Never skip or — the positioning system depends on this structure.
PortalPositionerPositioner props: , , , , ,
sidealignsideOffsetalignOffsetcollisionAvoidancecollisionPaddingCSS variables available on Positioner for sizing:
- ,
--anchor-width--anchor-height - ,
--available-width--available-height --transform-origin
Select、Popover、Tooltip、Menu、Combobox等组件均使用相同的三层嵌套模式来实现定位遮罩:
tsx
<Component.Portal> {/* 渲染到document.body中 */}
<Component.Positioner> {/* 处理相对于锚点的定位 */}
<Component.Popup> {/* 可见的浮动元素 */}
{/* 内容 */}
</Component.Popup>
</Component.Positioner>
</Component.Portal>请勿省略或 — 定位系统依赖此结构。
PortalPositionerPositioner属性: , , , , ,
sidealignsideOffsetalignOffsetcollisionAvoidancecollisionPaddingPositioner上可用的CSS变量(用于尺寸控制):
- ,
--anchor-width--anchor-height - ,
--available-width--available-height --transform-origin
Styling with Data Attributes
使用数据属性进行样式设置
Base UI exposes component state via data attributes instead of className toggles:
| Attribute | Meaning |
|---|---|
| Floating element is visible |
| Tab/item is active |
| Item has keyboard/mouse focus |
| Checkbox/radio/switch is checked |
| Checkbox/radio/switch is unchecked |
| Component is disabled |
| Field is required |
| Field passes validation |
| Field fails validation |
| Field value has changed |
| Field has been focused and blurred |
| `[data-side="top | right |
| `[data-align="start | center |
Base UI通过数据属性而非className切换来暴露组件状态:
| 属性 | 含义 |
|---|---|
| 浮动元素可见 |
| 标签页/项处于激活状态 |
| 项获得键盘/鼠标焦点 |
| 复选框/单选框/开关已勾选 |
| 复选框/单选框/开关未勾选 |
| 组件已禁用 |
| 字段为必填项 |
| 字段验证通过 |
| 字段验证失败 |
| 字段值已更改 |
| 字段已被聚焦并失焦 |
| `[data-side="top | right |
| `[data-align="start | center |
Animations
动画
Use and for enter/exit transitions:
[data-starting-style][data-ending-style]css
.popup {
opacity: 1;
transform: translateY(0);
transition: opacity 200ms, transform 200ms;
}
.popup[data-starting-style],
.popup[data-ending-style] {
opacity: 0;
transform: translateY(-8px);
}使用和实现进入/退出过渡效果:
[data-starting-style][data-ending-style]css
.popup {
opacity: 1;
transform: translateY(0);
transition: opacity 200ms, transform 200ms;
}
.popup[data-starting-style],
.popup[data-ending-style] {
opacity: 0;
transform: translateY(-8px);
}Component Categories
组件分类
Components are organized into four categories. For detailed API, props, and examples, see the corresponding reference file.
组件分为四大类。如需详细API、属性和示例,请查看对应的参考文档。
Floating Components
浮动组件
→ See
references/floating-components.mdSelect, Popover, Tooltip, Menu, Menubar, ContextMenu, Combobox, PreviewCard
→ 查看
references/floating-components.mdSelect、Popover、Tooltip、Menu、Menubar、ContextMenu、Combobox、PreviewCard
Overlay Components
遮罩组件
→ See
references/overlay-components.mdDialog, AlertDialog, Drawer
→ 查看
references/overlay-components.mdDialog、AlertDialog、Drawer
Form Components
表单组件
→ See
references/form-components.mdField, Fieldset, Form, Input, Checkbox, Radio, NumberField, Slider, Switch, Toggle
→ 查看
references/form-components.mdField、Fieldset、Form、Input、Checkbox、Radio、NumberField、Slider、Switch、Toggle
Display Components
展示组件
→ See
references/display-components.mdAccordion, Avatar, Button, Tabs, Toast, Toolbar, Progress, ScrollArea, Separator, ToggleGroup, Collapsible
→ 查看
references/display-components.mdAccordion、Avatar、Button、Tabs、Toast、Toolbar、Progress、ScrollArea、Separator、ToggleGroup、Collapsible
Utilities
工具函数
→ See
references/utilities.mdmergeProps, useRender, CSPProvider, DirectionProvider
→ 查看
references/utilities.mdmergeProps、useRender、CSPProvider、DirectionProvider
Critical Rules
关键规则
Always
必须遵守
- Use for floating components
Portal > Positioner > Popup - Add to root CSS
isolation: isolate - Use prop (not
align)alignment - Use +
Select.Item(notSelect.ItemText)Option - Use for Tabs (not
[data-active])[data-selected] - Use when combining multiple prop objects
mergeProps - Import from sub-paths:
'@base-ui/react/component-name' - Place /
delayoncloseDelay, notTooltip.TriggerTooltip.Root - Wrap app in for shared tooltip defaults
Tooltip.Provider
- 浮动组件使用结构
Portal > Positioner > Popup - 为根节点CSS添加
isolation: isolate - 使用属性(而非
align)alignment - 使用+
Select.Item(而非Select.ItemText)Option - 标签页使用(而非
[data-active])[data-selected] - 合并多个属性对象时使用
mergeProps - 从子路径导入:
'@base-ui/react/component-name' - 将/
delay设置在closeDelay上,而非Tooltip.TriggerTooltip.Root - 使用包裹应用以设置全局tooltip默认值
Tooltip.Provider
Never
禁止操作
- Use — Base UI uses
asChildprop insteadrender - Skip or
Portalfor floating componentsPositioner - Use Radix UI naming conventions (they differ)
- Assume Accordion allows multiple panels by default (defaults to
multiple)false - Place tooltip timing props on Root instead of Trigger
- 请勿使用— Base UI使用
asChild属性替代render - 浮动组件请勿省略或
PortalPositioner - 请勿使用Radix UI的命名约定(两者存在差异)
- 请勿默认认为Accordion允许多个面板展开(默认值为
multiple)false - 请勿将tooltip的计时属性设置在Root上,而应设置在Trigger上