Skip to content

Dialog 对话框

浏览量:

Dialog 对话框组件是基于 Element Plus 的 el-dialog 组件封装而成,用于在保留当前页面状态的情况下,告知用户并承载相关操作。

INFO

Dialog 组件完全继承了 Element Plus Dialog 组件的所有属性和事件,因此支持所有 Element Plus Dialog 组件的功能,包括自定义头部、底部、居中布局、全屏显示等高级特性。

插槽命名规则

Dialog 组件的插槽使用 dialog-{slotName} 格式,其中 slotName 对应 Element Plus el-dialog 组件的插槽名称。例如:

  • dialog-header 对应 el-dialogheader 插槽
  • dialog-footer 对应 el-dialogfooter 插槽
  • dialog-default 对应 el-dialogdefault 插槽(也可以直接使用默认插槽)

基础用法

Dialog 通过 v-model 控制显示和隐藏。你可以通过 title 属性设置对话框标题,通过 width 属性设置对话框宽度。使用 before-close 属性可以设置关闭前的回调函数。

loading

嵌套内容

Dialog 组件可以嵌套表格、表单等复杂内容。你可以根据实际需求在对话框内容区域放置任何内容。

loading

自定义头部

通过 dialog-header 插槽可以自定义对话框头部。插槽提供了 closetitleIdtitleClass 等参数,方便你自定义关闭按钮和标题样式。你可以通过 show-close 属性控制是否显示默认的关闭按钮。

loading

居中布局

通过 center 属性可以让对话框的头部和底部居中显示。

loading

关闭时销毁

通过 destroy-on-close 属性可以在对话框关闭时销毁其中的元素。这在对话框内容较多或包含复杂组件时,可以提升性能。

loading

全屏对话框

通过 fullscreen 属性可以让对话框全屏显示。

loading

属性说明

属性名类型默认值说明
modelValue / v-modelBooleanfalse是否显示对话框,使用 v-model 进行双向绑定
titleString''对话框标题,也可以通过 dialog-header 插槽自定义
widthString | Number'50%'对话框宽度,支持百分比和像素值
fullscreenBooleanfalse是否全屏显示对话框
topString'15vh'对话框距离顶部的位置
modalBooleantrue是否显示遮罩层
modal-classString''遮罩层的自定义类名
append-to-bodyBooleanfalse是否将对话框插入到 body 元素上
lock-scrollBooleantrue是否在对话框出现时将 body 滚动锁定
custom-classString''对话框的自定义类名
open-delayNumber0对话框打开的延时时间,单位毫秒
close-delayNumber0对话框关闭的延时时间,单位毫秒
close-on-click-modalBooleantrue是否可以通过点击遮罩层关闭对话框
close-on-press-escapeBooleantrue是否可以通过按下 ESC 键关闭对话框
show-closeBooleantrue是否显示关闭按钮
before-closeFunctionundefined关闭前的回调函数,会暂停对话框的关闭。回调函数执行后才会关闭对话框。接收 done 函数作为参数,调用 done() 后才会关闭对话框
centerBooleanfalse是否对头部和底部采用居中布局
destroy-on-closeBooleanfalse当关闭对话框时,销毁其中的元素
draggableBooleanfalse是否可拖拽对话框
align-centerBooleanfalse是否水平垂直居中对话框
其他属性--支持透传 Element Plus el-dialog 组件的所有属性

TIP

  • 组件完全兼容 Element Plus Dialog 的所有属性和功能
  • 可以参考 Element Plus Dialog 文档 了解更多高级用法
  • before-close 回调函数接收一个 done 函数作为参数,必须调用 done() 才会关闭对话框
  • width 属性支持字符串(如 '500px''50%')和数字(如 500,单位为像素)

插槽说明

组件支持通过插槽自定义对话框的各个部分。插槽命名规则为 dialog-{slotName},其中 slotName 对应 Element Plus el-dialog 组件的插槽名称。

插槽名说明作用域参数
dialog-header自定义对话框头部内容{ close, titleId, titleClass } - close 为关闭对话框的函数,titleId 为标题的 id,titleClass 为标题的类名
dialog-footer自定义对话框底部内容-
dialog-default对话框的主要内容(也可以直接使用默认插槽)-

TIP

  • 插槽名称必须以 dialog- 开头,后面的部分会作为 el-dialog 的插槽名
  • 可以直接使用默认插槽来定义对话框内容,效果与 dialog-default 相同
  • dialog-header 插槽提供了 close 函数,可以在自定义头部中调用它来关闭对话框
  • 如果使用了 dialog-header 插槽,建议设置 show-close="false" 来隐藏默认的关闭按钮

事件说明

事件名说明回调参数触发时机
open对话框打开时触发-对话框打开动画开始时触发
opened对话框打开动画结束时触发-对话框打开动画完全结束后触发
close对话框关闭时触发-对话框关闭动画开始时触发
closed对话框关闭动画结束时触发-对话框关闭动画完全结束后触发
update:modelValue绑定值更新时触发(用于 v-model 双向绑定)(value: Boolean) - 新的值modelValue 值发生变化时触发,用于实现双向绑定
open-auto-focus对话框打开后,焦点自动聚焦到对话框内时触发-对话框打开后,焦点自动聚焦到对话框内时触发
close-auto-focus对话框关闭后,焦点自动聚焦到触发元素上时触发-对话框关闭后,焦点自动聚焦到触发元素上时触发

TIP

  • openopened 的区别:open 在打开动画开始时触发,opened 在打开动画完全结束后触发
  • closeclosed 的区别:close 在关闭动画开始时触发,closed 在关闭动画完全结束后触发
  • 组件完全兼容 Element Plus Dialog 的所有事件,可以参考 Element Plus Dialog 文档 了解更多事件

高级功能

由于组件完全继承了 Element Plus Dialog 的所有功能,因此支持以下高级特性:

可拖拽

通过设置 draggable 属性,可以让对话框可以通过拖拽移动位置。

居中显示

通过设置 align-center 属性,可以让对话框在页面中水平垂直居中显示。

自定义遮罩层

通过设置 modal-class 属性,可以自定义遮罩层的样式类名。

关闭前确认

通过设置 before-close 属性,可以在对话框关闭前执行一些操作(如确认提示),只有调用 done() 函数后才会真正关闭对话框。

嵌套对话框

Dialog 组件支持嵌套使用,可以在一个对话框内打开另一个对话框。

注意事项

  1. 显示控制

    • 使用 v-model 进行双向绑定,这是推荐的方式
    • modelValue 的值必须是布尔类型,true 表示显示,false 表示隐藏
  2. 插槽使用

    • 插槽名称必须以 dialog- 开头,例如 dialog-headerdialog-footer
    • 可以直接使用默认插槽来定义对话框内容
    • 如果使用了 dialog-header 插槽,建议设置 show-close="false" 来隐藏默认的关闭按钮
  3. 关闭前回调

    • before-close 回调函数必须接收一个 done 函数作为参数
    • 只有调用 done() 后,对话框才会真正关闭
    • 如果不调用 done(),对话框将保持打开状态
  4. 性能优化

    • 如果对话框内容较多或包含复杂组件,建议设置 destroy-on-close="true",在关闭时销毁内容以提升性能
    • 对于频繁打开关闭的对话框,可以考虑使用 v-if 来控制组件的创建和销毁
  5. Element Plus 兼容性

    • 组件完全兼容 Element Plus Dialog 的所有功能和 API
    • 可以参考 Element Plus Dialog 文档 了解更多高级用法
    • 支持透传 Element Plus el-dialog 的所有属性和事件
  6. 样式定制

    • 可以通过 custom-class 属性添加自定义类名来定制对话框样式
    • 可以通过 modal-class 属性定制遮罩层样式

常见问题

Q: 为什么我的对话框无法关闭?

A: 请检查以下几点:

  • 确保 v-model 绑定的值可以正常更新
  • 如果设置了 before-close 回调,确保在回调中调用了 done() 函数
  • 检查是否设置了 close-on-click-modal="false"close-on-press-escape="false",导致无法通过点击遮罩层或按 ESC 键关闭

Q: 如何自定义对话框头部?

A: 使用 dialog-header 插槽可以自定义头部内容。插槽提供了 closetitleIdtitleClass 等参数。如果使用了自定义头部,建议设置 show-close="false" 来隐藏默认的关闭按钮。

Q: before-close 回调函数如何使用?

A: before-close 回调函数接收一个 done 函数作为参数。你可以在回调中执行一些操作(如确认提示),然后调用 done() 来关闭对话框。如果不调用 done(),对话框将保持打开状态。

Q: 对话框内容很多时如何优化性能?

A: 建议设置 destroy-on-close="true",这样在对话框关闭时会销毁其中的元素,下次打开时重新创建,可以提升性能。但需要注意,如果对话框内容包含表单等需要保持状态的内容,可能不适合使用此属性。

Q: 如何实现嵌套对话框?

A: Dialog 组件支持嵌套使用,只需要在一个对话框的内容区域放置另一个 Dialog 组件即可。注意控制好每个对话框的 v-model 值。

Q: 如何让对话框居中显示?

A: 可以通过设置 align-center 属性让对话框在页面中水平垂直居中显示。也可以通过设置 center 属性让对话框的头部和底部内容居中显示。

最佳实践

  1. 使用 v-model 进行双向绑定:这是 Vue 3 推荐的方式,代码更简洁
  2. 合理使用 before-close:在需要关闭前确认的场景(如未保存的表单),使用 before-close 来提示用户
  3. 性能优化:对于内容较多或包含复杂组件的对话框,使用 destroy-on-close 来优化性能
  4. 自定义头部和底部:根据业务需求,使用插槽自定义对话框的头部和底部,提供更好的用户体验
  5. 响应式设计:使用百分比或响应式单位来设置对话框宽度,适配不同屏幕尺寸
  6. 无障碍访问:使用 dialog-header 插槽时,确保正确使用 titleIdtitleClass,以提供良好的无障碍访问体验