AlertDialog
需要用户明确确认的重要操作对话框
确认对话框(AlertDialog)用于在执行删除、提交、覆盖等关键操作前,要求用户做出明确决策。
import {
AlertDialog,
AlertDialogAction,
AlertDialogCancel,
AlertDialogContent,
AlertDialogDescription,
AlertDialogFooter,
AlertDialogHeader,
AlertDialogOverlay,
AlertDialogTitle
} from '@skyroc/web-ui';何时使用
- 操作具有风险或不可逆,需要用户再次确认时(如删除数据、重置配置)。
- 流程需要被临时阻塞,必须等待用户确认或取消后才能继续。
- 需要用明确的标题、描述和操作按钮说明决策后果时。
- 普通页面提示使用 Alert;通用内容弹窗使用 Dialog;需要确认关键操作时使用 AlertDialog。
语义类型
通过 type 设置确认对话框的语义类型。组件会根据类型显示对应的默认图标,帮助用户快速识别操作性质。
| 类型 | 语义 | 适用场景 |
|---|---|---|
destructive | 危险操作 | 删除、清空、覆盖等不可逆操作 |
success | 成功确认 | 完成、提交、发布等积极结果 |
warning | 警告确认 | 有潜在风险但仍可继续的操作 |
info | 信息确认 | 阅读说明、确认已知信息或继续流程 |
尺寸
通过 size 调整对话框的宽度、间距、字号和按钮区域间距,从 xs 到 2xl 共 6 个尺寸。
| 尺寸 | 最大宽度 | 字号 | 适用场景 |
|---|---|---|---|
xs | max-w-md | 10px | 紧凑确认、短文本提示 |
sm | max-w-md | 12px | 次级操作确认 |
md | max-w-lg | 14px | 常规场景(默认) |
lg | max-w-xl | 16px | 重要操作确认 |
xl | max-w-2xl | 18px | 内容较多的确认流程 |
2xl | max-w-3xl | 20px | 大幅内容或重点确认 |
自定义图标
通过 icon 传入自定义图标或视觉元素。传入 icon 后会覆盖 type 对应的默认图标。
按钮与页脚
默认页脚包含取消按钮和确认按钮。通过 showCancel={false} 可以隐藏取消按钮;通过 okText 和 cancelText 修改按钮文本;通过 onOk 和 onCancel 监听用户操作。
如果需要完全自定义页脚内容,可通过 footer 传入 React 节点;设置为 null 或 false 时隐藏页脚。
自定义样式
通过 classNames 精细控制各个 slot 的 class,包括 overlay、content、header、title、description、footer 和 icon。
也可以通过 contentProps、headerProps、titleProps、descriptionProps、footerProps、overlayProps 分别向对应结构组件传入额外属性。
API
AlertDialog
通用属性参考:基于 Radix UI AlertDialog,支持底层根组件、Portal、Overlay 和 Content 的相关属性。
| 属性 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| trigger | 触发对话框打开的元素,通常是 Button | ReactNode | - |
| title | 对话框标题,用于说明当前需要确认的操作 | ReactNode | - |
| description* | 对话框描述文本,用于补充说明操作影响或风险 | string | - |
| type | 语义类型,决定默认图标和语义色 | 'destructive' | 'info' | 'success' | 'warning' | - |
| size | 尺寸,影响对话框宽度、字号与间距 | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 'md' |
| icon | 自定义图标,传入后覆盖 type 的默认图标 | ReactNode | - |
| children | 插入到描述区域和页脚之间的自定义内容 | ReactNode | - |
| footer | 自定义页脚内容;设为 null 或 false 时隐藏页脚 | ReactNode | null | false | - |
| showCancel | 是否显示默认取消按钮 | boolean | true |
| okText | 默认确认按钮文本 | ReactNode | 'OK' |
| cancelText | 默认取消按钮文本 | ReactNode | 'Cancel' |
| onOk | 点击默认确认按钮时触发 | (event: React.MouseEvent<HTMLButtonElement>) => void | - |
| onCancel | 点击默认取消按钮时触发 | (event: React.MouseEvent<HTMLButtonElement>) => void | - |
| okButtonProps | 传递给默认确认按钮的 Button 属性 | ButtonProps | - |
| cancelButtonProps | 传递给默认取消按钮的 Button 属性 | ButtonProps | - |
| classNames | 各 slot 的自定义 class(overlay / content / header / title / description / footer / icon) | AlertDialogClassNames | - |
| contentProps | 传递给 AlertDialogContent 的额外 props | AlertDialogContentProps | - |
| headerProps | 传递给 AlertDialogHeader 的额外 props | AlertDialogHeaderProps | - |
| titleProps | 传递给 AlertDialogTitle 的额外 props | AlertDialogTitleProps | - |
| descriptionProps | 传递给 AlertDialogDescription 的额外 props | AlertDialogDescriptionProps | - |
| footerProps | 传递给 AlertDialogFooter 的额外 props | AlertDialogFooterProps | - |
| overlayProps | 传递给 AlertDialogOverlay 的额外 props | AlertDialogOverlayProps | - |
| forceMountPortal | 强制挂载 Portal | true | - |
| forceMountOverlay | 强制挂载 Overlay | true | - |
| open | 受控模式下的打开状态 | boolean | - |
| defaultOpen | 非受控模式下的默认打开状态 | boolean | - |
| onOpenChange | 打开状态变化时触发 | (open: boolean) => void | - |
| className | 传递给内容容器的自定义 class | ClassValue | - |
子组件
AlertDialog 也导出基础结构组件,适合在需要更细粒度组合时使用。
| 属性 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| AlertDialogAction | 确认操作按钮,继承 ButtonProps | ButtonProps | - |
| AlertDialogCancel | 取消操作按钮,继承 ButtonProps,默认 variant 为 plain | ButtonProps | - |
| AlertDialogContent | 对话框内容容器,支持对应 Radix Content props、size 和 className | AlertDialogContentProps | - |
| AlertDialogDescription | 描述文本区域,支持对应 Radix Description props、size 和 className | AlertDialogDescriptionProps | - |
| AlertDialogFooter | 页脚容器,支持 div 元素 props、size 和 className | AlertDialogFooterProps | - |
| AlertDialogHeader | 头部容器,支持 div 元素 props、size 和 className | AlertDialogHeaderProps | - |
| AlertDialogOverlay | 遮罩层,支持对应 Radix Overlay props、size 和 className | AlertDialogOverlayProps | - |
| AlertDialogTitle | 标题区域,支持对应 Radix Title props、size 和 className | AlertDialogTitleProps | - |
类型
AlertDialogProps
主组件属性。组合了 Radix AlertDialog Root、Content、Portal 的属性,并额外提供标题、描述、按钮、图标和 slot 样式配置。
| 字段 | 类型 | 说明 |
|---|---|---|
| cancelButtonProps | ButtonProps | 取消按钮属性。这里只引用 ButtonProps,不展开 Button 的字段。 |
| cancelText | React.ReactNode | 取消按钮文本。默认值为 Cancel。 |
| children | React.ReactNode | 插入到描述区域和页脚之间的内容,也可来自底层 Radix 组件属性。 |
| className | ClassValue | 内容容器的 class。来自 StyledComponentProps。 |
| classNames | AlertDialogClassNames | 各 slot 的自定义 class。 |
| container | Element | DocumentFragment | null | Portal 挂载容器。来自 Radix Portal props。 |
| contentProps | AlertDialogContentProps | 传递给 AlertDialogContent 的额外属性。 |
| defaultOpen | boolean | 非受控模式下的默认打开状态。来自 Radix Root props。 |
| description* | string | 对话框描述文本。 |
| descriptionProps | AlertDialogDescriptionProps | 传递给 AlertDialogDescription 的额外属性。 |
| disabledPortal | boolean | 类型中存在,但当前组件实现没有消费该字段;不建议依赖。 |
| footer | React.ReactNode | null | false | 页脚内容。设为 null 或 false 时隐藏页脚。 |
| footerProps | AlertDialogFooterProps | 传递给 AlertDialogFooter 的额外属性。 |
| forceMount | true | 强制挂载底层 Content 或 Portal。来自 Radix props。 |
| forceMountOverlay | true | 强制挂载遮罩层。 |
| forceMountPortal | true | 强制挂载 Portal。 |
| headerProps | AlertDialogHeaderProps | 传递给 AlertDialogHeader 的额外属性。 |
| icon | React.ReactNode | 标题前的图标或视觉元素。 |
| okButtonProps | ButtonProps | 确认按钮属性。这里只引用 ButtonProps,不展开 Button 的字段。 |
| okText | React.ReactNode | 确认按钮文本。默认值为 OK。 |
| onCancel | (e: React.MouseEvent<HTMLButtonElement>) => void | 点击取消按钮时触发。 |
| onEscapeKeyDown | (event: KeyboardEvent) => void | 按 Escape 触发关闭前的事件。来自 Radix Content props。 |
| onOk | (e: React.MouseEvent<HTMLButtonElement>) => void | 点击确认按钮时触发。 |
| onOpenAutoFocus | (event: Event) => void | 打开后自动聚焦前触发。来自 Radix Content props。 |
| onOpenChange | (open: boolean) => void | 打开状态变化时触发。来自 Radix Root props。 |
| open | boolean | 受控模式下的打开状态。来自 Radix Root props。 |
| overlayProps | AlertDialogOverlayProps | 传递给 AlertDialogOverlay 的额外属性。 |
| showCancel | boolean | 是否显示默认取消按钮。默认值为 true。 |
| size | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 组件尺寸。来自 StyledComponentProps。 |
| title | React.ReactNode | 对话框标题。 |
| titleProps | AlertDialogTitleProps | 传递给 AlertDialogTitle 的额外属性。 |
| trigger | React.ReactNode | 触发对话框打开的元素。 |
| type | 'destructive' | 'info' | 'success' | 'warning' | 语义类型,用于决定默认图标。 |
AlertDialogClassNames
各 slot 的自定义 class,用于精细化控制 AlertDialog 各部分的样式。
| 字段 | 类型 | 说明 |
|---|---|---|
| overlay | ClassValue | 遮罩层的 class。 |
| content | ClassValue | 内容容器的 class。 |
| header | ClassValue | 头部区域的 class。 |
| title | ClassValue | 标题区域的 class。 |
| description | ClassValue | 描述文本的 class。 |
| footer | ClassValue | 页脚区域的 class。 |
| icon | string | 图标元素的 class。 |
AlertDialogContentProps
内容容器属性。继承 Radix AlertDialog Content props,并通过 StyledComponentProps 增加 className 和 size。
| 字段 | 类型 | 说明 |
|---|---|---|
| children | React.ReactNode | 内容区域子节点。 |
| className | ClassValue | 内容容器的 class。 |
| forceMount | true | 强制挂载内容容器。 |
| id | string | DOM id。来自 div 元素属性。 |
| onCloseAutoFocus | (event: Event) => void | 关闭后自动聚焦前触发。 |
| onEscapeKeyDown | (event: KeyboardEvent) => void | 按 Escape 时触发。 |
| onOpenAutoFocus | (event: Event) => void | 打开后自动聚焦前触发。 |
| size | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 尺寸,影响内容容器字号、宽度和间距。 |
AlertDialogDescriptionProps
描述文本属性。继承 Radix AlertDialog Description props,并通过 StyledComponentProps 增加 className 和 size。
| 字段 | 类型 | 说明 |
|---|---|---|
| children | React.ReactNode | 描述文本或自定义描述内容。 |
| className | ClassValue | 描述区域的 class。 |
| id | string | DOM id。来自 p 元素属性。 |
| size | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 尺寸,影响描述文本字号。 |
AlertDialogFooterProps
页脚容器属性。等价于 HTMLComponentProps<"div">。
| 字段 | 类型 | 说明 |
|---|---|---|
| children | React.ReactNode | 页脚内容,通常是操作按钮。 |
| className | ClassValue | 页脚容器的 class。 |
| id | string | DOM id。来自 div 元素属性。 |
| size | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 尺寸,影响页脚按钮间距。 |
AlertDialogHeaderProps
头部容器属性。等价于 HTMLComponentProps<"div">。
| 字段 | 类型 | 说明 |
|---|---|---|
| children | React.ReactNode | 头部内容,通常包含标题和描述。 |
| className | ClassValue | 头部容器的 class。 |
| id | string | DOM id。来自 div 元素属性。 |
| size | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 尺寸,影响头部内容间距。 |
AlertDialogOverlayProps
遮罩层属性。继承 Radix AlertDialog Overlay props,并通过 StyledComponentProps 增加 className 和 size。
| 字段 | 类型 | 说明 |
|---|---|---|
| children | React.ReactNode | 遮罩层子节点。通常不需要传入。 |
| className | ClassValue | 遮罩层的 class。 |
| forceMount | true | 强制挂载遮罩层。 |
| id | string | DOM id。来自 div 元素属性。 |
| size | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 尺寸属性会被接收,但当前遮罩层样式不依赖 size。 |
AlertDialogTitleProps
标题区域属性。继承 Radix AlertDialog Title props,并通过 StyledComponentProps 增加 className 和 size。
| 字段 | 类型 | 说明 |
|---|---|---|
| children | React.ReactNode | 标题内容。 |
| className | ClassValue | 标题区域的 class。 |
| id | string | DOM id。来自 h2 元素属性。 |
| size | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 尺寸,影响标题字号和图标间距。 |
StyledComponentProps<T>
项目内用于包装 Radix props 的通用类型。
| 字段 | 类型 | 说明 |
|---|---|---|
| ...T | Omit<T, "className"> | 继承原始组件属性,但重新定义 className。 |
| className | ClassValue | 组件 class。 |
| size | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 项目统一尺寸类型。 |
HTMLComponentProps<T>
HTML 元素属性包装类型,用于 Header 和 Footer 这类 div 容器。
| 字段 | 类型 | 说明 |
|---|---|---|
| ...React.ComponentPropsWithRef<T> | React.ComponentPropsWithRef<T> | 继承指定 HTML 元素的原生属性和 ref。 |
| className | ClassValue | 组件 class。 |
| size | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 项目统一尺寸类型。 |
DialogSlots
AlertDialog 可配置 classNames 的内置 slot