Skip to content

Vben Modal 模态框

框架提供的模态框组件,支持拖拽全屏自动高度loading等功能。

如果文档内没有参数说明,可以尝试在在线示例内寻找

写在前面

如果你觉得现有组件的封装不够理想,或者不完全符合你的需求,大可以直接使用原生组件,亦或亲手封装一个适合的组件。框架提供的组件并非束缚,使用与否,完全取决于你的需求与自由。

README

下方示例代码中的,存在一些国际化、主题色未适配问题,这些问题只在文档内会出现,实际使用并不会有这些问题,可忽略,不必纠结。

基础用法

使用 useVbenModal 创建最基础的模态框。

组件抽离

Modal 内的内容一般业务中,会比较复杂,所以我们可以将 modal 内的内容抽离出来,也方便复用。通过 connectedComponent 参数,可以将内外组件进行连接,而不用其他任何操作。

开启拖拽

通过 draggable 参数,可开启拖拽功能。

自动计算高度

弹窗会自动计算内容高度,超过一定高度会出现滚动条,同时结合 loading 效果以及使用 prepend-footer 插槽。

使用 Api

通过 modalApi 可以调用 modal 的方法以及使用 setState 更新 modal 的状态。

数据共享

如果你使用了 connectedComponent 参数,那么内外组件会共享数据,比如一些表单回填等操作。可以用 modalApi 来获取数据和设置数据,配合 onOpenChange,可以满足大部分的需求。

动画类型

通过 animationType 属性可以控制弹窗的动画效果:

  • slide(默认):从顶部向下滑动进入/退出
  • scale:缩放淡入/淡出效果

注意

  • VbenModal 组件对与参数的处理优先级是 slot > props > state(通过api更新的状态以及useVbenModal参数)。如果你已经传入了 slot 或者 props,那么 setState 将不会生效,这种情况下你可以通过 slot 或者 props 来更新状态。
  • 如果你使用到了 connectedComponent 参数,那么会存在 2 个useVbenModal, 此时,如果同时设置了相同的参数,那么以内部为准(也就是没有设置 connectedComponent 的代码)。比如 同时设置了 onConfirm,那么以内部的 onConfirm 为准。onOpenChange事件除外,内外都会触发。另外,如果设置了destroyOnClose,内部Modal及其子组件会在被关闭后完全销毁
  • 如果弹窗的默认行为不符合你的预期,可以在src\bootstrap.ts中修改setDefaultModalProps的参数来设置默认的属性,如默认隐藏全屏按钮,修改默认ZIndex等。

API

ts
// Modal 为弹窗组件
// modalApi 为弹窗的方法
const [Modal, modalApi] = useVbenModal({
  // 属性
  // 事件
});

Props

所有属性都可以传入 useVbenModal 的第一个参数中。

属性名描述类型默认值
appendToMain是否挂载到内容区域(默认挂载到body)booleanfalse
connectedComponent连接另一个Modal组件Component-
destroyOnClose关闭时销毁booleanfalse
title标题string|slot-
titleTooltip标题提示信息string|slot-
description描述信息string|slot-
isOpen弹窗打开状态booleanfalse
loading弹窗加载状态booleanfalse
fullscreen全屏显示booleanfalse
fullscreenButton显示全屏按钮booleantrue
draggable可拖拽booleanfalse
closable显示关闭按钮booleantrue
centered居中显示booleanfalse
modal显示遮罩booleantrue
header显示headerbooleantrue
footer显示footerboolean|slottrue
confirmDisabled禁用确认按钮booleanfalse
confirmLoading确认按钮loading状态booleanfalse
closeOnClickModal点击遮罩关闭弹窗booleantrue
closeOnPressEscapeesc 关闭弹窗booleantrue
confirmText确认按钮文本string|slot确认
cancelText取消按钮文本string|slot取消
showCancelButton显示取消按钮booleantrue
showConfirmButton显示确认按钮booleantrue
classmodal的class,宽度通过这个配置string-
contentClassmodal内容区域的classstring-
footerClassmodal底部区域的classstring-
headerClassmodal顶部区域的classstring-
bordered是否显示borderbooleanfalse
zIndex弹窗的ZIndex层级number1000
overlayBlur遮罩模糊度number-
animationType动画类型'slide' | 'scale''slide'
submitting标记为提交中,锁定弹窗当前状态booleanfalse

appendToMain

appendToMain可以指定将弹窗挂载到内容区域,打开这种弹窗时,内容区域以外的部分(标签栏、导航菜单等等)不会被遮挡。默认情况下,弹窗会挂载到body上。但是:挂载到内容区域时,作为页面根容器的Page组件,需要设置auto-content-height属性,以便弹窗能够正确计算高度。

Event

以下事件,只有在 useVbenModal({onCancel:()=>{}}) 中传入才会生效。

事件名描述类型版本号
onBeforeClose关闭前触发,返回 false或者被reject则禁止关闭()=>Promise<boolean>|boolean>5.5.2支持Promise
onCancel点击取消按钮触发()=>void
onClosed关闭动画播放完毕时触发()=>void>5.4.3
onConfirm点击确认按钮触发()=>void
onOpenChange关闭或者打开弹窗时触发(isOpen:boolean)=>void
onOpened打开动画播放完毕时触发()=>void>5.4.3

Slots

除了上面的属性类型包含slot,还可以通过插槽来自定义弹窗的内容。

插槽名描述
default默认插槽 - 弹窗内容
prepend-footer取消按钮左侧
center-footer取消按钮和确认按钮中间(不使用 footer 插槽时有效)
append-footer确认按钮右侧

modalApi

方法描述类型版本
setState动态设置弹窗状态属性(((prev: ModalState) => Partial<ModalState>)| Partial<ModalState>)=>modalApi-
open打开弹窗()=>void-
close关闭弹窗()=>void-
setData设置共享数据<T>(data:T)=>modalApi-
getData获取共享数据<T>()=>T-
useStore获取可响应式状态--
lock将弹窗标记为提交中,锁定当前状态(isLock:boolean)=>modalApi>5.5.2
unlocklock方法的反操作,解除弹窗的锁定状态,也是lock(false)的别名()=>modalApi>5.5.3

lock

lock方法用于锁定当前弹窗的状态,一般用于提交数据的过程中防止用户重复提交或者弹窗被意外关闭、表单数据被改变等等。当处于锁定状态时,弹窗的确认按钮会变为loading状态,同时禁用取消按钮和关闭按钮、禁止ESC或者点击遮罩等方式关闭弹窗、开启弹窗的spinner动画以遮挡弹窗内容。调用close方法关闭处于锁定状态的弹窗时,会自动解锁。要主动解除这种状态,可以调用unlock方法或者再次调用lock方法并传入false参数。

贡献者

The avatar of contributor named as Netfan Netfan
The avatar of contributor named as vben vben
The avatar of contributor named as ming4762 ming4762
The avatar of contributor named as panda7 panda7

页面历史

基于 MIT 许可发布.