Dialog
用于承载表单、确认内容或短流程操作的通用模态对话框
Dialog 用于在当前页面之上展示一段需要用户关注的内容。它基于 Radix Dialog 封装,提供标题、描述、关闭按钮、内容区和页脚操作的常用组合。
import {
Dialog,
DialogAction,
DialogClose,
DialogContent,
DialogDescription,
DialogFooter,
DialogHeader,
DialogOverlay,
DialogPortal,
DialogRoot,
DialogTitle,
DialogTrigger
} from '@skyroc/web-ui';何时使用
- 需要在不离开当前页面的情况下展示补充内容、表单或短流程。
- 需要用户完成一个轻量操作后再回到原页面。
- 需要自定义页脚按钮、关闭按钮或内容布局。
- 需要确认高风险操作时使用 AlertDialog;只展示页面内提示时使用 Alert。
基础用法
通过 trigger 提供打开对话框的触发元素,通过 title、description 和 children 组织内容。
页脚操作
默认页脚包含一个 OK 按钮,点击后会触发 onOk 并关闭对话框。通过 footer 可以完全替换页脚内容;设置为 null 或 false 时隐藏页脚。
尺寸
通过 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 | 大幅内容或复杂布局 |
自定义样式
通过 classNames 可以分别控制 overlay、content、header、title、description、close 和 footer。也可以通过 contentProps、headerProps、titleProps、descriptionProps、closeProps、footerProps、overlayProps 向对应结构组件传入额外属性。
受控状态
Dialog 透传 Radix Root 的 open、defaultOpen、onOpenChange 和 modal。当前封装会始终渲染 DialogTrigger,因此实际使用时应提供 trigger 元素。
API
Dialog
通用属性参考:基于 Radix Dialog Root,支持打开状态、模态行为、标题描述、内容区、页脚和 slot 样式配置。
| 属性 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| trigger* | 触发对话框打开的元素,通常是 Button | ReactNode | - |
| title | 对话框标题,用于说明当前弹窗的目的 | ReactNode | - |
| description | 对话框描述文本,用于补充说明上下文 | ReactNode | - |
| children | 内容区节点,显示在头部和页脚之间 | ReactNode | - |
| footer | 自定义页脚内容;设为 null 或 false 时隐藏页脚 | ReactNode | null | false | - |
| okText | 默认 OK 按钮文本 | ReactNode | 'OK' |
| onOk | 点击默认 OK 按钮时触发 | DialogActionHandler | - |
| okButtonProps | 传递给默认 OK 按钮的 Button 属性 | ButtonProps | - |
| size | 尺寸,影响对话框宽度、字号与间距 | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 'md' |
| classNames | 各 slot 的自定义 class(overlay / content / header / title / description / close / footer) | DialogClassNames | - |
| contentComponent | 替换默认内容容器的自定义组件 | DialogContentComponent | - |
| contentProps | 传递给 DialogContent 的额外 props | DialogContentProps | - |
| closeProps | 传递给 DialogClose 的额外 props | DialogCloseProps | - |
| headerProps | 传递给 DialogHeader 的额外 props | DialogHeaderProps | - |
| titleProps | 传递给 DialogTitle 的额外 props | DialogTitleProps | - |
| descriptionProps | 传递给 DialogDescription 的额外 props | DialogDescriptionProps | - |
| footerProps | 传递给 DialogFooter 的额外 props | DialogFooterProps | - |
| overlayProps | 传递给 DialogOverlay 的额外 props | DialogOverlayProps | - |
| open | 受控模式下的打开状态 | boolean | - |
| defaultOpen | 非受控模式下的默认打开状态 | boolean | - |
| onOpenChange | 打开状态变化时触发 | (open: boolean) => void | - |
| modal | 是否以模态方式打开 | boolean | - |
| className | 传递给内容容器的自定义 class;优先级高于 classNames.content | ClassValue | - |
子组件
Dialog 也导出基础结构组件,适合在需要更细粒度组合时使用。
| 属性 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| DialogRoot | Radix Dialog Root 原语,用于自定义组合根节点 | radix primitive | - |
| DialogTrigger | Radix Dialog Trigger 原语,用于自定义触发元素 | radix primitive | - |
| DialogPortal | Radix Dialog Portal 原语,用于控制挂载位置 | DialogPortalProps | - |
| DialogOverlay | 遮罩层,支持对应 Radix Overlay props、size 和 className | DialogOverlayProps | - |
| DialogContent | 对话框内容容器,支持对应 Radix Content props、size 和 className | DialogContentProps | - |
| DialogHeader | 头部容器,支持 header 元素 props、size 和 className | DialogHeaderProps | - |
| DialogTitle | 标题区域,支持对应 Radix Title props、size 和 className | DialogTitleProps | - |
| DialogDescription | 描述文本区域,支持对应 Radix Description props、size 和 className | DialogDescriptionProps | - |
| DialogClose | 关闭按钮,未传 children 时显示默认 X 图标按钮 | DialogCloseProps | - |
| DialogFooter | 页脚容器,支持 footer 元素 props、size 和 className | DialogFooterProps | - |
| DialogAction | 默认操作按钮,继承 ButtonProps,并会在点击后关闭对话框 | ButtonProps | - |
类型
DialogProps
主组件属性。组合了 Radix Dialog Root 属性,并额外提供标题、描述、内容区、页脚、默认操作按钮和 slot 样式配置。
| 字段 | 类型 | 说明 |
|---|---|---|
| children | ReactNode | 内容区节点。 |
| className | ClassValue | 内容容器的 class。来自 StyledComponentProps。 |
| classNames | DialogClassNames | 各 slot 的自定义 class。 |
| closeProps | DialogCloseProps | 传递给关闭按钮的额外属性。 |
| contentComponent | DialogContentComponent | 替换默认内容容器的组件。 |
| contentProps | DialogContentProps | 传递给内容容器的额外属性。 |
| defaultOpen | boolean | 非受控模式下的默认打开状态。来自 Radix Root props。 |
| description | ReactNode | 对话框描述内容。 |
| descriptionProps | DialogDescriptionProps | 传递给描述文本区域的额外属性。 |
| footer | ReactNode | null | false | 页脚内容。设为 null 或 false 时隐藏页脚。 |
| footerProps | DialogFooterProps | 传递给页脚容器的额外属性。 |
| headerProps | DialogHeaderProps | 传递给头部容器的额外属性。 |
| modal | boolean | 是否以模态方式打开。来自 Radix Root props。 |
| okButtonProps | ButtonProps | 默认 OK 按钮属性。这里只引用 ButtonProps,不展开 Button 的字段。 |
| okText | ReactNode | 默认 OK 按钮文本。默认值为 OK。 |
| onOk | DialogActionHandler | 点击默认 OK 按钮时触发。 |
| onOpenChange | (open: boolean) => void | 打开状态变化时触发。 |
| open | boolean | 受控模式下的打开状态。来自 Radix Root props。 |
| overlayProps | DialogOverlayProps | 传递给遮罩层的额外属性。 |
| size | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 组件尺寸。来自 StyledComponentProps。 |
| title | ReactNode | 对话框标题内容。 |
| titleProps | DialogTitleProps | 传递给标题区域的额外属性。 |
| trigger* | ReactNode | 触发对话框打开的元素。 |
DialogClassNames
各 slot 的自定义 class,用于精细化控制 Dialog 各部分的样式。
| 字段 | 类型 | 说明 |
|---|---|---|
| overlay | ClassValue | 遮罩层的 class。 |
| content | ClassValue | 内容容器的 class。 |
| header | ClassValue | 头部区域的 class。 |
| title | ClassValue | 标题区域的 class。 |
| description | ClassValue | 描述文本的 class。 |
| close | ClassValue | 关闭按钮的 class。 |
| footer | ClassValue | 页脚区域的 class。 |
DialogCloseProps
关闭按钮属性。继承 Radix Dialog Close props,并通过 StyledComponentProps 增加 className 和 size。
| 字段 | 类型 | 说明 |
|---|---|---|
| children | ReactNode | 自定义关闭按钮内容;不传时显示默认 X 图标按钮。 |
| className | ClassValue | 关闭按钮的 class。 |
| component | Component | 替换底层关闭组件,默认使用 Radix Close。 |
| size | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 尺寸,影响默认图标按钮大小和定位。 |
DialogContentProps
内容容器属性。继承 Radix Dialog Content props,并通过 StyledComponentProps 增加 className 和 size。
| 字段 | 类型 | 说明 |
|---|---|---|
| children | ReactNode | 内容区域子节点。 |
| className | ClassValue | 内容容器的 class。 |
| component | Component | 替换底层内容组件,默认使用 Radix Content。 |
| forceMount | true | 强制挂载内容容器。 |
| id | string | DOM id。来自 div 元素属性。 |
| onCloseAutoFocus | function | 关闭后自动聚焦前触发。 |
| onEscapeKeyDown | function | 按 Escape 时触发。 |
| onInteractOutside | function | 与内容区域外部交互时触发。 |
| onOpenAutoFocus | function | 打开后自动聚焦前触发。 |
| size | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 尺寸,影响内容容器字号、宽度和间距。 |
DialogDescriptionProps
描述文本属性。继承 Radix Dialog Description props,并通过 StyledComponentProps 增加 className 和 size。
| 字段 | 类型 | 说明 |
|---|---|---|
| children | ReactNode | 描述文本或自定义描述内容。 |
| className | ClassValue | 描述区域的 class。 |
| component | Component | 替换底层描述组件,默认使用 Radix Description。 |
| id | string | DOM id。来自 p 元素属性。 |
| size | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 尺寸,影响描述文本字号。 |
DialogFooterProps
页脚容器属性。继承 footer 元素属性,并通过 StyledComponentProps 增加 className 和 size。
| 字段 | 类型 | 说明 |
|---|---|---|
| children | ReactNode | 页脚内容,通常是操作按钮。 |
| className | ClassValue | 页脚容器的 class。 |
| id | string | DOM id。来自 footer 元素属性。 |
| size | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 尺寸,影响页脚按钮间距。 |
DialogHeaderProps
头部容器属性。继承 header 元素属性,并通过 StyledComponentProps 增加 className 和 size。
| 字段 | 类型 | 说明 |
|---|---|---|
| children | ReactNode | 头部内容,通常包含标题和描述。 |
| className | ClassValue | 头部容器的 class。 |
| id | string | DOM id。来自 header 元素属性。 |
| size | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 尺寸,影响头部内容间距。 |
DialogOverlayProps
遮罩层属性。继承 Radix Dialog Overlay props,并通过 StyledComponentProps 增加 className 和 size。
| 字段 | 类型 | 说明 |
|---|---|---|
| children | ReactNode | 遮罩层子节点。通常不需要传入。 |
| className | ClassValue | 遮罩层的 class。 |
| component | Component | 替换底层遮罩组件,默认使用 Radix Overlay。 |
| forceMount | true | 强制挂载遮罩层。 |
| id | string | DOM id。来自 div 元素属性。 |
| size | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 尺寸属性会被接收,但当前遮罩层样式不依赖 size。 |
DialogTitleProps
标题区域属性。继承 Radix Dialog Title props,并通过 StyledComponentProps 增加 className 和 size。
| 字段 | 类型 | 说明 |
|---|---|---|
| children | ReactNode | 标题内容。 |
| className | ClassValue | 标题区域的 class。 |
| component | Component | 替换底层标题组件,默认使用 Radix Title。 |
| id | string | DOM id。来自 h2 元素属性。 |
| size | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 尺寸,影响标题字号。 |
StyledComponentProps<T>
项目内用于包装 Radix props 或原生元素 props 的通用类型。
| 字段 | 类型 | 说明 |
|---|---|---|
| ...sourceProps | inherited props without className | 继承原始组件属性,但重新定义 className。 |
| className | ClassValue | 组件 class。 |
| size | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 项目统一尺寸类型。 |
DialogSlots
Dialog 可配置 classNames 的内置 slot
DialogActionHandler
默认 OK 按钮点击回调
DialogPortalProps
DialogPortal 透传的 Radix Portal 属性