对话框
概述
覆盖在主窗口或其他对话框之上、并使其下层内容失效的窗口。
SDialog 是用于内联场景的声明式包装组件。dialog(...) 是用于以编程方式创建警告式对话框的命令式 API。它组合 DialogRoot/DialogTrigger/DialogOverlay/DialogPopup/DialogHeader/DialogContent/DialogFooter/DialogTitle/DialogDescription/DialogClose/DialogFullscreen/DialogCancel/DialogConfirm 这一系列 Aria 基础组件(零样式)与 dialogVariants 样式配方(12 个槽、6 种尺寸)。
调用命令式 dialog(...) API 前,请在应用根部附近挂载一次 SDialogProvider。
用法
声明式
命令式 API
<script setup lang="ts">
import { h } from 'vue';
import { SButton, SDialogProvider, dialog } from '@vean/ui';
function openWarningDialog() {
dialog.warning('删除项目', {
description: '此操作无法撤销。',
content: h('div', '请先确认再继续。'),
confirmText: '删除'
});
}
</script>
<template>
<SDialogProvider />
<SButton color="warning" @click="openWarningDialog">打开对话框</SButton>
</template>特性
- 🧩 Aria/样式分离 —
DialogCompact聚合基础组件并组合遮罩/弹层/头部/内容/底部;SDialog只注入样式并转发插槽/事件 - 🖱️ 声明式 + 命令式 — 带触发器的内联
SDialog,或由SDialogProvider驱动的dialog.*API - 🎭 默认模态 —
modal渲染aria-modal、useHideOthers、外部指针拦截与焦点陷阱;用modal={false}切换 - ⚠️ 警告模式 —
isAlert切换为role="alertdialog",并加入类型图标与aria-live(polite/assertive) - 🏷️ 无障碍标题/描述 —
title/description连接aria-labelledby/aria-describedby - ❌ 可关闭 —
showClose渲染关闭控件;Escape、外部指针/焦点与关闭按钮均可关闭 - 🖐️ 可拖拽 —
draggable支持拖动头部移动对话框(基于@vueuse/core的useDraggable) - ⛶ 全屏 —
showFullscreen渲染切换按钮;fullscreen/defaultFullscreen驱动v-model:fullscreen状态 - 🔘 取消/确认 —
showCancel/showConfirm,cancelText/confirmText取自dialog.cancel/dialog.confirm本地化消息 - 🧹 纯净模式 —
pure移除头部与底部,用于完全自定义内容 - 📐 6 种尺寸 — xs–2xl
size;逐槽ui覆盖 - ♿ 无障碍 — 真实
role="dialog"、焦点陷阱 + 循环、关闭时焦点还原、axe-core零违规
组件家族
SDialog(样式层)— 入口包装组件;dialogVariants配方配合动态插槽转发SDialogProvider(样式层)— 承载命令式dialog(...)API;订阅DialogStateDialogRoot(Aria)— 状态持有者;经useControllableState维护open,提供dir/modal与provideDialogRootContextDialogTrigger(Aria)— 打开对话框的ButtonDialogOverlay(Aria)— 变暗的背景遮罩DialogPopup/DialogPopupImpl(Aria)— 承载对话框主体的可关闭、焦点陷阱表面DialogTitle/DialogDescription(Aria)— 用于标注/描述的元素DialogClose(Aria)— 关闭控件,切换open并发出closeDialogFullscreen(Aria)— 全屏切换按钮,切换fullscreen状态并发出fullscreenDialogCancel/DialogConfirm(Aria)— 底部操作,发出cancel/confirmDialogHeader/DialogContent/DialogFooter(Aria)— 布局分区DialogCompact(Aria)— 聚合组件;组合所有基础组件并暴露各分区插槽
演示
基础
底部
状态
阻止关闭
Dialog API
可拖拽
全屏
API
Aria 层
19Dialog
属性
| 属性名 | 类型 | 默认值 | 描述 |
|---|---|---|---|
showFullscreen | boolean | false | 是否在对话框的标题栏中显示全屏切换按钮。 |
class | ClassValue | — | 对话框的 popup 类 |
size | ThemeSize | — | 组件的视觉尺寸。 |
ui | Partial<DialogUi> | — | 该组件的按槽类重写。 |
title | string | — | 对话框的标题。此标题用于辅助功能,若未提供 `title` 槽,则会显示在对话框的标题栏中。 |
description | string | — | 对话框的描述。此描述用于辅助功能,若未提供 `description` 槽,则会在对话框内容中显示。 |
icon | IconValue | — | 对话框的图标。该图标用于辅助功能,若未提供 `icon` 槽,则会显示在对话框的标题栏中。 |
showClose | boolean | true | 是否在对话框的标题栏中显示关闭按钮。 |
pure | boolean | false | 是否使用不包含页眉和页脚的“纯版”对话框。
当您希望完全控制对话框内容且不需要内置页眉和页脚时,此选项非常有用。 |
showCancel | boolean | 'onlyWarning' | 'onlyWarning' | 是否显示“取消”按钮。
当设置为 `onlyWarning` 时,只有当对话框是 `alertType="warning"` 的警告对话框时,才会显示“取消”按钮。
当设置为 `true` 时,将始终显示“取消”按钮。 |
cancelText | string | — | “取消”按钮的文本。此文本用于辅助功能,若未提供 `cancel` 插槽,则会在对话框的页脚中显示。
默认采用来自 `ConfigProvider` 的本地化 `dialog.cancel` 消息。 |
showConfirm | boolean | — | 当对话框为提示对话框时,是否显示确认按钮。
当对话框为提示对话框时,默认值为 `true`。 |
confirmText | string | — | “确认”按钮的文本。此文本用于辅助功能,若未提供 `confirm` 插槽,则会显示在对话框的页脚中。
默认采用来自 `ConfigProvider` 的本地化 `dialog.confirm` 消息。 |
triggerProps | DialogTriggerProps | — | 转发给触发元素的属性。 |
overlayProps | DialogOverlayProps | — | 转发给覆盖元素的属性。 |
portalProps | PortalProps | — | 转发给 portal 元素的属性。 |
popupProps | DialogPopupProps | — | 转发给弹出窗口元素的属性。 |
headerProps | DialogHeaderProps | — | 转发至 header 元素的属性。 |
contentProps | DialogContentProps | — | 转发给内容元素的属性。 |
footerProps | DialogFooterProps | — | 转发至页脚元素的属性。 |
titleProps | DialogTitleProps | — | 传递给 title 元素的属性。 |
descriptionProps | DialogDescriptionProps | — | 已将属性转发至 description 元素。 |
closeProps | DialogCloseProps | — | 转发至 close 元素的属性。 |
fullscreenProps | DialogFullscreenProps | — | 转发给全屏元素的属性。 |
cancelProps | DialogCancelProps | — | 转发给 cancel 元素的属性。 |
confirmProps | DialogConfirmProps | — | 转发给 confirm 元素的属性。 |
modal | ModalityTier | true | 对话框的模态属性。当设置为 `true` 时,将禁用与外部元素的交互,且屏幕阅读器仅能读取对话框
内容。
设置为 `'trap-focus'` 可在捕获焦点的同时仍允许外部指针事件通过(非模态侧边面板,例如
`'trap-focus'` 层级的 `Drawer`)。 |
dir | Direction | — | 对话框的文本方向 |
isAlert | boolean | false | 该对话框是否为警报对话框。警报对话框是一种会中断用户工作流程以传达重要信息并需要用户做出响应的对话框。
当设置为 `true` 时,对话框将具有 `role="alertdialog"` 属性,并需要提供 `DialogTitle`。此设置用于辅助功能支持。 |
alertType | DialogAlertType | — | 对话框的“alert”类型,当对话框为警报对话框时,该类型将决定默认图标和样式。 |
draggable | boolean | false | 是否可以通过拖动对话框的标题来移动该对话框。 |
fullscreen | boolean | undefined | 对话框的可控全屏状态。可通过 `v-model:fullscreen` 进行绑定。 |
defaultFullscreen | boolean | false | 对话框初次渲染时的全屏状态。当您无需控制其全屏状态时使用此选项。 |
open | boolean | undefined | 对话框的受控打开状态。可通过 `v-model:open` 进行绑定。 |
defaultOpen | boolean | false | 对话框在初始渲染时的打开状态。当无需控制其打开状态时使用。 |
事件
| 事件名 | 参数 | 描述 |
|---|---|---|
update:open | boolean | 当对话框的打开状态发生变化时调用的事件处理程序。 |
update:fullscreen | boolean | 当对话框的全屏状态发生变化时调用的事件处理程序。 |
click | PointerEvent | 当对话框触发器被激活时调用的事件处理程序。 |
escapeKeyDown | KeyboardEvent | 当 Esc 键被按下时触发的事件处理程序。可被阻止。 |
pointerDownOutside | PointerDownOutsideEvent | 当 `pointerdown` 事件发生在 `DismissableLayer` 外部时调用的事件处理程序。可被阻止。 |
focusOutside | FocusOutsideEvent | 当焦点移出 `DismissableLayer` 时触发的事件处理程序。可被阻止。 |
interactOutside | PointerDownOutsideEvent | FocusOutsideEvent | 当在 `DismissableLayer` 外部发生交互时触发的事件处理程序。具体而言,当 `pointerdown`
事件在该区域外部发生,或焦点移出该区域时触发。此事件可被阻止。 |
openAutoFocus | Event | 在打开页面时自动聚焦时触发的事件处理程序。可被阻止。 |
closeAutoFocus | Event | 在关闭时自动聚焦时触发的事件处理程序。可被阻止。 |
close | MouseEvent | 当请求关闭对话框时调用的事件处理程序。 |
fullscreen | MouseEvent | 当请求切换对话框的全屏状态时,会调用此事件处理程序。 |
confirm | MouseEvent | 当通过确认操作请求关闭对话框时,将调用此事件处理程序。 |
cancel | MouseEvent | 当请求取消对话框时调用的事件处理程序。 |
插槽
| 插槽名 | 参数 | 描述 |
|---|---|---|
default | props: DialogCompactBaseSlotProps | 默认插槽的自定义内容。 |
trigger | DialogCompactBaseSlotProps | 触发槽的自定义内容。 |
title | DialogCompactBaseSlotProps | 标题槽位的自定义内容。 |
description | DialogCompactBaseSlotProps | 描述字段的自定义内容。 |
close | DialogCompactBaseSlotProps | close 插槽的自定义内容。 |
fullscreen | DialogCompactBaseSlotProps | 全屏插槽的自定义内容。 |
footer | DialogCompactBaseSlotProps | 页脚位置的自定义内容。 |
cancel | DialogCompactBaseSlotProps | “cancel”插槽的自定义内容。 |
confirm | DialogCompactBaseSlotProps | 用于 confirm 插槽的自定义内容。 |
DialogCancel
属性
| 属性名 | 类型 | 默认值 | 描述 |
|---|---|---|---|
type | ButtonType | 'button' | 按钮元素的类型。可以是 'button'、'submit' 或 'reset' 之一。 |
disabled | boolean | — | 该组件是否已禁用。 |
asChild | boolean | — | 将默认渲染元素替换为作为子元素传递的元素,并合并两者的属性及行为。 |
as | AsTag | Component | 'div' | 该组件应渲染为的元素或组件。可通过 `asChild` 进行覆盖。 |
事件
| 事件名 | 参数 | 描述 |
|---|---|---|
cancel | MouseEvent | 当请求取消对话框时调用的事件处理程序。 |
DialogClose
属性
| 属性名 | 类型 | 默认值 | 描述 |
|---|---|---|---|
type | ButtonType | 'button' | 按钮元素的类型。可以是 'button'、'submit' 或 'reset' 之一。 |
disabled | boolean | — | 该组件是否已禁用。 |
asChild | boolean | — | 将默认渲染元素替换为作为子元素传递的元素,并合并两者的属性及行为。 |
as | AsTag | Component | 'div' | 该组件应渲染为的元素或组件。可通过 `asChild` 进行覆盖。 |
事件
| 事件名 | 参数 | 描述 |
|---|---|---|
close | MouseEvent | 当请求关闭对话框时调用的事件处理程序。 |
DialogCompact
属性
| 属性名 | 类型 | 默认值 | 描述 |
|---|---|---|---|
title | string | — | 对话框的标题。此标题用于辅助功能,若未提供 `title` 槽,则会显示在对话框的标题栏中。 |
description | string | — | 对话框的描述。此描述用于辅助功能,若未提供 `description` 槽,则会在对话框内容中显示。 |
icon | IconValue | — | 对话框的图标。该图标用于辅助功能,若未提供 `icon` 槽,则会显示在对话框的标题栏中。 |
showClose | boolean | true | 是否在对话框的标题栏中显示关闭按钮。 |
showFullscreen | boolean | true | 是否在对话框的标题栏中显示全屏切换按钮。 |
pure | boolean | false | 是否使用不包含页眉和页脚的“纯版”对话框。
当您希望完全控制对话框内容且不需要内置页眉和页脚时,此选项非常有用。 |
showCancel | boolean | 'onlyWarning' | 'onlyWarning' | 是否显示“取消”按钮。
当设置为 `onlyWarning` 时,只有当对话框是 `alertType="warning"` 的警告对话框时,才会显示“取消”按钮。
当设置为 `true` 时,将始终显示“取消”按钮。 |
cancelText | string | — | “取消”按钮的文本。此文本用于辅助功能,若未提供 `cancel` 插槽,则会在对话框的页脚中显示。
默认采用来自 `ConfigProvider` 的本地化 `dialog.cancel` 消息。 |
showConfirm | boolean | — | 当对话框为提示对话框时,是否显示确认按钮。
当对话框为提示对话框时,默认值为 `true`。 |
confirmText | string | — | “确认”按钮的文本。此文本用于辅助功能,若未提供 `confirm` 插槽,则会显示在对话框的页脚中。
默认采用来自 `ConfigProvider` 的本地化 `dialog.confirm` 消息。 |
triggerProps | DialogTriggerProps | — | 转发给触发元素的属性。 |
overlayProps | DialogOverlayProps | — | 转发给覆盖元素的属性。 |
portalProps | PortalProps | — | 转发给 portal 元素的属性。 |
popupProps | DialogPopupProps | — | 转发给弹出窗口元素的属性。 |
headerProps | DialogHeaderProps | — | 转发至 header 元素的属性。 |
contentProps | DialogContentProps | — | 转发给内容元素的属性。 |
footerProps | DialogFooterProps | — | 转发至页脚元素的属性。 |
titleProps | DialogTitleProps | — | 传递给 title 元素的属性。 |
descriptionProps | DialogDescriptionProps | — | 已将属性转发至 description 元素。 |
closeProps | DialogCloseProps | — | 转发至 close 元素的属性。 |
fullscreenProps | DialogFullscreenProps | — | 转发给全屏元素的属性。 |
cancelProps | DialogCancelProps | — | 转发给 cancel 元素的属性。 |
confirmProps | DialogConfirmProps | — | 转发给 confirm 元素的属性。 |
modal | ModalityTier | true | 对话框的模态属性。当设置为 `true` 时,将禁用与外部元素的交互,且屏幕阅读器仅能读取对话框
内容。
设置为 `'trap-focus'` 可在捕获焦点的同时仍允许外部指针事件通过(非模态侧边面板,例如
`'trap-focus'` 层级的 `Drawer`)。 |
dir | Direction | — | 对话框的文本方向 |
isAlert | boolean | false | 该对话框是否为警报对话框。警报对话框是一种会中断用户工作流程以传达重要信息并需要用户做出响应的对话框。
当设置为 `true` 时,对话框将具有 `role="alertdialog"` 属性,并需要提供 `DialogTitle`。此设置用于辅助功能支持。 |
alertType | DialogAlertType | — | 对话框的“alert”类型,当对话框为警报对话框时,该类型将决定默认图标和样式。 |
draggable | boolean | false | 是否可以通过拖动对话框的标题来移动该对话框。 |
fullscreen | boolean | undefined | 对话框的可控全屏状态。可通过 `v-model:fullscreen` 进行绑定。 |
defaultFullscreen | boolean | false | 对话框初次渲染时的全屏状态。当您无需控制其全屏状态时使用此选项。 |
open | boolean | undefined | 对话框的受控打开状态。可通过 `v-model:open` 进行绑定。 |
defaultOpen | boolean | false | 对话框在初始渲染时的打开状态。当无需控制其打开状态时使用。 |
事件
| 事件名 | 参数 | 描述 |
|---|---|---|
update:open | boolean | 当对话框的打开状态发生变化时调用的事件处理程序。 |
update:fullscreen | boolean | 当对话框的全屏状态发生变化时调用的事件处理程序。 |
click | PointerEvent | 当对话框触发器被激活时调用的事件处理程序。 |
escapeKeyDown | KeyboardEvent | 当 Esc 键被按下时触发的事件处理程序。可被阻止。 |
pointerDownOutside | PointerDownOutsideEvent | 当 `pointerdown` 事件发生在 `DismissableLayer` 外部时调用的事件处理程序。可被阻止。 |
focusOutside | FocusOutsideEvent | 当焦点移出 `DismissableLayer` 时触发的事件处理程序。可被阻止。 |
interactOutside | PointerDownOutsideEvent | FocusOutsideEvent | 当在 `DismissableLayer` 外部发生交互时触发的事件处理程序。具体而言,当 `pointerdown`
事件在该区域外部发生,或焦点移出该区域时触发。此事件可被阻止。 |
openAutoFocus | Event | 在打开页面时自动聚焦时触发的事件处理程序。可被阻止。 |
closeAutoFocus | Event | 在关闭时自动聚焦时触发的事件处理程序。可被阻止。 |
close | MouseEvent | 当请求关闭对话框时调用的事件处理程序。 |
fullscreen | MouseEvent | 当请求切换对话框的全屏状态时,会调用此事件处理程序。 |
confirm | MouseEvent | 当通过确认操作请求关闭对话框时,将调用此事件处理程序。 |
cancel | MouseEvent | 当请求取消对话框时调用的事件处理程序。 |
插槽
| 插槽名 | 参数 | 描述 |
|---|---|---|
default | props: DialogCompactBaseSlotProps | 默认插槽的自定义内容。 |
trigger | DialogCompactBaseSlotProps | 触发槽的自定义内容。 |
title | DialogCompactBaseSlotProps | 标题槽位的自定义内容。 |
description | DialogCompactBaseSlotProps | 描述字段的自定义内容。 |
close | DialogCompactBaseSlotProps | close 插槽的自定义内容。 |
fullscreen | DialogCompactBaseSlotProps | 全屏插槽的自定义内容。 |
footer | DialogCompactBaseSlotProps | 页脚位置的自定义内容。 |
cancel | DialogCompactBaseSlotProps | “cancel”插槽的自定义内容。 |
confirm | DialogCompactBaseSlotProps | 用于 confirm 插槽的自定义内容。 |
DialogCompactBase
DialogConfirm
属性
| 属性名 | 类型 | 默认值 | 描述 |
|---|---|---|---|
type | ButtonType | 'button' | 按钮元素的类型。可以是 'button'、'submit' 或 'reset' 之一。 |
disabled | boolean | — | 该组件是否已禁用。 |
asChild | boolean | — | 将默认渲染元素替换为作为子元素传递的元素,并合并两者的属性及行为。 |
as | AsTag | Component | 'div' | 该组件应渲染为的元素或组件。可通过 `asChild` 进行覆盖。 |
事件
| 事件名 | 参数 | 描述 |
|---|---|---|
confirm | MouseEvent | 当通过确认操作请求关闭对话框时,将调用此事件处理程序。 |
DialogContent
DialogDescription
DialogFooter
DialogFullscreen
属性
| 属性名 | 类型 | 默认值 | 描述 |
|---|---|---|---|
type | ButtonType | 'button' | 按钮元素的类型。可以是 'button'、'submit' 或 'reset' 之一。 |
disabled | boolean | — | 该组件是否已禁用。 |
asChild | boolean | — | 将默认渲染元素替换为作为子元素传递的元素,并合并两者的属性及行为。 |
as | AsTag | Component | 'div' | 该组件应渲染为的元素或组件。可通过 `asChild` 进行覆盖。 |
事件
| 事件名 | 参数 | 描述 |
|---|---|---|
fullscreen | MouseEvent | 当请求切换对话框的全屏状态时,会调用此事件处理程序。 |
DialogFullscreenState
事件
| 事件名 | 参数 | 描述 |
|---|---|---|
update:fullscreen | boolean | 当对话框的全屏状态发生变化时调用的事件处理程序。 |
DialogHeader
DialogOverlay
属性
| 属性名 | 类型 | 默认值 | 描述 |
|---|---|---|---|
forceMount | boolean | — | 用于在需要更多控制时强制挂载。
在使用 Vue 动画库控制动画时非常有用。 |
DialogPopup
属性
| 属性名 | 类型 | 默认值 | 描述 |
|---|---|---|---|
asChild | boolean | — | 将默认渲染元素替换为作为子元素传递的元素,并合并两者的属性及行为。 |
as | AsTag | Component | 'div' | 该组件应渲染为的元素或组件。可通过 `asChild` 进行覆盖。 |
forceMount | boolean | — | 用于在需要更多控制时强制挂载。
在使用 Vue 动画库控制动画时非常有用。 |
事件
| 事件名 | 参数 | 描述 |
|---|---|---|
escapeKeyDown | KeyboardEvent | 当 Esc 键被按下时触发的事件处理程序。可被阻止。 |
pointerDownOutside | PointerDownOutsideEvent | 当 `pointerdown` 事件发生在 `DismissableLayer` 外部时调用的事件处理程序。可被阻止。 |
focusOutside | FocusOutsideEvent | 当焦点移出 `DismissableLayer` 时触发的事件处理程序。可被阻止。 |
interactOutside | PointerDownOutsideEvent | FocusOutsideEvent | 当在 `DismissableLayer` 外部发生交互时触发的事件处理程序。具体而言,当 `pointerdown`
事件在该区域外部发生,或焦点移出该区域时触发。此事件可被阻止。 |
openAutoFocus | Event | 在打开页面时自动聚焦时触发的事件处理程序。可被阻止。 |
closeAutoFocus | Event | 在关闭时自动聚焦时触发的事件处理程序。可被阻止。 |
DialogPortal
DialogProvider
DialogRoot
属性
| 属性名 | 类型 | 默认值 | 描述 |
|---|---|---|---|
modal | ModalityTier | true | 对话框的模态属性。当设置为 `true` 时,将禁用与外部元素的交互,且屏幕阅读器仅能读取对话框
内容。
设置为 `'trap-focus'` 可在捕获焦点的同时仍允许外部指针事件通过(非模态侧边面板,例如
`'trap-focus'` 层级的 `Drawer`)。 |
dir | Direction | — | 对话框的文本方向 |
isAlert | boolean | false | 该对话框是否为警报对话框。警报对话框是一种会中断用户工作流程以传达重要信息并需要用户做出响应的对话框。
当设置为 `true` 时,对话框将具有 `role="alertdialog"` 属性,并需要提供 `DialogTitle`。此设置用于辅助功能支持。 |
alertType | DialogAlertType | — | 对话框的“alert”类型,当对话框为警报对话框时,该类型将决定默认图标和样式。 |
draggable | boolean | false | 是否可以通过拖动对话框的标题来移动该对话框。 |
fullscreen | boolean | undefined | 对话框的可控全屏状态。可通过 `v-model:fullscreen` 进行绑定。 |
defaultFullscreen | boolean | false | 对话框初次渲染时的全屏状态。当您无需控制其全屏状态时使用此选项。 |
open | boolean | undefined | 对话框的受控打开状态。可通过 `v-model:open` 进行绑定。 |
defaultOpen | boolean | false | 对话框在初始渲染时的打开状态。当无需控制其打开状态时使用。 |
事件
| 事件名 | 参数 | 描述 |
|---|---|---|
update:open | boolean | 当对话框的打开状态发生变化时调用的事件处理程序。 |
DialogTitle
DialogTrigger
属性
| 属性名 | 类型 | 默认值 | 描述 |
|---|---|---|---|
type | ButtonType | 'button' | 按钮元素的类型。可以是 'button'、'submit' 或 'reset' 之一。 |
disabled | boolean | — | 该组件是否已禁用。 |
asChild | boolean | — | 将默认渲染元素替换为作为子元素传递的元素,并合并两者的属性及行为。 |
as | AsTag | Component | 'div' | 该组件应渲染为的元素或组件。可通过 `asChild` 进行覆盖。 |
事件
| 事件名 | 参数 | 描述 |
|---|---|---|
click | PointerEvent | 当对话框触发器被激活时调用的事件处理程序。 |
注意事项
架构与对标差异
DialogCompact 负责遮罩/弹层/头部/内容/底部组合与命令式 dialog(...) 状态流,所有基础组件保持零样式,仅由 UI 包装组件注入 dialogVariants 类。这与 radix-ui/shadcn-ui 的 headless/样式分离一致。Ant Design、Element Plus、Mantine、Naive UI 提供带 mask/closable/keyboard/width prop 的单一样式化对话框;VeanUI 额外暴露逐槽 *Props 通道、size 尺寸体系,以及单包库通常收敛为静态服务的命令式 provider API(dialog.*)。
| 能力 | VeanUI | shadcn/ui | Ant Design Modal | Element Plus Dialog | Mantine Modal | Naive UI Dialog |
|---|---|---|---|---|---|---|
| Aria/样式分离 | ✅ | ✅ | — | — | — | — |
| 命令式 API | ✅ | — | ✅ | ✅ | ✅ | ✅ |
| 模态(aria-modal+陷阱) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| 警告模式(alertdialog) | ✅ | ✅ | ✅ | — | — | ✅ |
| 关闭时焦点还原 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| 尺寸(6) | ✅ | — | — | — | — | — |
| 本地化取消/确认文本 | ✅ | — | — | — | — | — |
| 纯净(无头/底部) | ✅ | — | — | — | — | — |
— = 不支持或采用不同交互模型。
运行时注意
DialogCompact默认modal(true);portal 将弹层传送至document.body,body 滚动由 hide-others 层管理。- 警告对话框的
showConfirm默认为true;showCancel默认为'onlyWarning'(仅alertType="warning"时显示取消)。传显式布尔值可覆盖。 cancelText/confirmText默认取dialog.cancel/dialog.confirm的本地化消息;可按实例覆盖。isAlert需要提供DialogTitle以保证无障碍(role="alertdialog"必须被标注)。设置title或title插槽。pure会移除头部与底部,因此title/description不再渲染——该模式下请自行提供可访问的标注。- 命令式
dialog(...)API 需要挂载SDialogProvider;未挂载时调用为 no-op。
FAQ
如何控制打开状态?
用 v-model 绑定 open,或传 defaultOpen 使用非受控对话框:
<SDialog v-model:open="open" title="偏好设置">...</SDialog>如何显示警告式对话框?
设置 is-alert 与 alert-type。弹层会获得 role="alertdialog" 及对应类型图标:
<SDialog is-alert alert-type="warning" title="删除" description="此操作无法撤销。">
<template #trigger><SButton>删除</SButton></template>
</SDialog>如何使用命令式 API?
挂载一次 SDialogProvider,然后在任意位置调用 dialog.*(完整示例见「概述」):
import { dialog } from '@vean/ui';
dialog.warning('磁盘已满', { description: '请释放空间。' });如何构建完全自定义的对话框?
使用 pure 并填充默认插槽:
<SDialog v-model:open="open" pure>
<div class="custom">...</div>
</SDialog>如何制作非模态对话框?
设置 modal={false} 以允许与对话框外部内容交互:
<SDialog v-model:open="open" :modal="false" title="面板">...</SDialog>如何制作可拖拽对话框?
设置 draggable,拖动头部即可移动对话框。位置会保持到对话框关闭:
<SDialog draggable title="面板">
<template #trigger><SButton>打开</SButton></template>
<div>拖动头部即可移动此对话框。</div>
</SDialog>如何使用全屏模式?
通过头部按钮切换(showFullscreen,默认隐藏,需显式传 show-fullscreen 开启),或用 v-model:fullscreen 驱动:
<SDialog v-model:fullscreen="fullscreen" title="面板">...</SDialog>