Dialog 对话框

在保留当前页面上下文的前提下向用户展示信息或收集操作。

基础用法

弹层对话框,可高度定制。

使用布尔类型的 model-value / v-model 控制显示;为 true 时展示。对话框分为 bodyfooter,底部内容放在名为 footer 的插槽中。可选 title 定义标题(默认为空)。本例同时演示 before-close 的用法。

TIP

before-close 仅在点击关闭图标或遮罩时生效。若在 footer 插槽中放置关闭按钮,请在对应点击逻辑中自行处理与 before-close 相同的行为。

自定义内容

内容可为任意结构,例如表格或表单。本例演示与 Uniboot UI 表格、表单组合使用。

自定义头部

使用 header 插槽自定义标题区域。为兼顾无障碍,请同时设置 title 属性,或通过插槽属性 titleId 指定作为对话框标题朗读的元素。

嵌套对话框

对话框嵌套时需设置 append-to-body

一般不推荐嵌套;若页面需多个对话框,可平铺为同级节点。若必须嵌套,请将内层对话框的 append-to-body 设为 true,使其挂到 body 而非父节点,以保证层级与样式正确。

居中布局

可将标题与底部操作区水平居中。

centertrue 时,标题与底部水平居中;仅影响头部与底部,正文区域需自行编写样式居中。

TIP

对话框内容采用懒渲染:首次打开前默认插槽不会挂载到 DOM。若需操作 DOM 或通过 ref 访问子组件,请在 open 事件回调中执行。

屏幕居中

自屏幕中央打开对话框。

align-centertrue 时水平、垂直居中;此时 top 不再生效,因垂直方向由 Flex 居中。

关闭时销毁

开启后,默认插槽内容在关闭时通过 v-if 销毁,适合有性能顾虑的场景。

注意开启后,在 transition.beforeEnter 触发前正文不会渲染,初始仅有遮罩与(若有)头部、底部。

可拖拽对话框

拖拽标题栏区域移动。

draggabletrue 可拖拽;overflowtrue 时允许拖出视口一定范围。

TIP

modalfalse 时,请务必将 append-to-body 设为 trueDialog 使用 position: relative 定位,去掉遮罩后会相对当前 DOM 位置而非 document.body 定位,易导致样式错乱。

全屏

设置 fullscreen 以全屏展示。

TIP

fullscreentrue 时,widthtopdraggable 均不生效。

头部图标

在对话框标题前显示图标,增强视觉提示效果。

通过 show-header-icon 控制是否显示图标,header-icon 设置图标(支持图标名称或组件),header-icon-class 自定义图标样式。

遮罩层

modalfalse 时不显示遮罩。

支持 modal-penetrable,可允许事件穿透。

自定义动画

通过 transition 自定义过渡,可为:

  • 过渡名称(字符串)

  • Vue Transition 配置对象

包含缩放、滑动、淡入淡出、弹跳等示例,以及带自定义钩子函数的对象写法。

TIP

动画类名会随过渡名称动态生成;若需细粒度控制,可自行声明相关类,详见 Vue 文档 custom-transition-classes

事件顺序

打开浏览器开发者工具(Ctrl + Shift + J)可观察事件触发顺序。

API

属性

名称说明类型默认值
model-value / v-model是否显示booleanfalse
title标题;也可通过具名插槽传入(见下表)string''
width宽度,默认 50%string / number''
fullscreen是否全屏booleanfalse
top对话框 CSS margin-top,默认 15vhstring''
modal是否显示遮罩booleantrue
modal-penetrable遮罩是否可穿透;需将 modal 设为 falsebooleanfalse
modal-class遮罩自定义类名string
header-class头部包裹层类名string
body-class内容区包裹层类名string
footer-class底部包裹层类名string
append-to-body是否将对话框挂到 body;嵌套对话框应设为 truebooleanfalse
append-to挂载目标元素;会覆盖 append-to-bodyCSSSelector / HTMLElementbody
lock-scroll显示时是否锁定 body 滚动booleantrue
open-delay打开前延迟(毫秒)number0
close-delay关闭前延迟(毫秒)number0
close-on-click-modal点击遮罩是否关闭booleantrue
close-on-press-escape按 ESC 是否关闭booleantrue
show-close是否显示关闭按钮booleanfalse
before-close关闭前回调;可调用传入的 done 关闭;若需阻止关闭则不调用Function
draggable是否可拖拽booleanfalse
overflow可拖拽时是否允许超出视口booleanfalse
center标题与底部是否水平居中booleanfalse
align-center对话框是否在视口水平、垂直居中booleanfalse
destroy-on-close关闭时是否销毁默认插槽内容booleanfalse
close-icon自定义关闭图标,默认 Closestring / Component
z-index同原生 z-indexnumber
header-aria-level a11y头部 aria-levelstring2
transition自定义过渡:过渡名字符串或 Vue TransitionProps 对象string / objectdialog-fade
show-header-icon是否显示头部图标booleanfalse
header-icon头部图标string / Component
header-icon-class头部图标的自定义类名string

WARNING

custom-class废弃,请改用 class

插槽

名称说明
default默认内容
header头部区域;替换后不再显示标题区文案,但关闭按钮仍保留
footer底部区域

WARNING

title 插槽已废弃

事件

名称说明类型
open打开时触发Function
opened打开动画结束后触发Function
close关闭时触发Function
closed关闭动画结束后触发Function
open-auto-focus打开且内容聚焦后触发Function
close-auto-focus关闭且焦点处理后触发Function

暴露

名称说明类型
resetPosition重置位置Function
handleClose关闭对话框Function

常见问题

在 SFC 中使用对话框时,scoped 样式不生效

典型讨论:#10515

说明:对话框通过 Teleport 渲染,根节点样式建议写在全局样式中。

对话框显示/隐藏时页面元素发生横向跳动

典型讨论:#10481

说明:建议将滚动区域放在 Vue 挂载根节点内(如 <div id="app" />),并对 body 使用 overflow: hidden 等策略。