Skip to content

Modal 对话框

模态对话框。需要确认操作或集中处理一段交互时使用。

基本使用

v-model:visible 控制开合。

自定义按钮文字 / 类型

ok-text / cancel-text 替换文案,ok-type="danger" 把确认按钮渲染为危险色。

异步关闭(确认按钮 loading)

通过 confirm-loading 控制确认按钮的加载状态,常用于点击确认后请求服务端,请求完成再关闭。

居中显示

centered 让 Modal 在视口垂直居中(默认距顶部 100px)。

自定义宽度

width 接受数字(px)或字符串(如 '80%')。

不带按钮 / 自定义页脚

:footer="null" 隐藏整个页脚;或用 footer 插槽完全自定义按钮区。slot 参数 { ok, cancel } 是默认的关闭函数。

命令式 Modal.confirm

Modal.confirm({...}) / .info / .success / .error / .warning 命令式弹窗,纯函数调用,不需要在模板中预写组件。返回 { destroy, update } 句柄。

命名空间约定

ccui Vue 风格:不挂静态属性子组件(如 Modal.Header / Modal.Footer 这类我们一律拆为顶层平铺组件)。但 Modal.confirm / .info 等是命令式函数调用,是命名空间下挂函数(而非组件),符合 JS 模块惯例,保留。

onOk 返回 Promise(loading 串行)

onOk 返回 Promise 时,OK 按钮自动进入 loading 状态直到 resolve;reject 时不关闭 modal(错误传给调用方)。

update / destroy 句柄

返回的 handle 可动态更新 title / content,或强制销毁。

ts
Modal.destroyAll() // 关闭所有当前活跃命令式 modal(不影响 <c-modal> 模板实例)

useModal composable

useModal() 返回 { modal, holder } 对象不是 React [modal, contextHolder] 元组)。命令式调用会继承调用组件的 provide / ConfigProvider / 主题 / locale 链——与全局 Modal.confirm 的最大差异:全局版走独立 createApp,拿不到调用方 app 的 inject。

何时用模块级 vs Hook 版?

  • Modal.confirm({...}):脚手架 / utils / 命令式弹一条,简单直接,但拿不到调用方 app 的 inject
  • useModal():当 confirm 弹窗需要继承父链 inject(自定义 ConfigProvider、主题、locale、formContext)时用。必须在模板中挂 <component :is="holder" /> 保持 API 一致;hook 在 setup 阶段捕获 instance 并在 modal.confirm() 调用时懒读 inst.provides 拿到最终 provides 链。

UseModalReturn

字段类型说明
modalModalApi命令式 API:confirm / info / success / error / warning
holderComponent必须挂到模板:<component :is="holder" />

ModalFuncOptions

字段类型默认说明
titlestring | VNode标题
contentstring | VNode正文
typeModalFuncType'confirm'confirm / info / success / error / warning
iconstring | VNode自定义图标(不传则按 type 渲染默认图标;传空字符串隐藏图标)
widthnumber | string416弹窗宽度(命令式默认 416 比常规 Modal 的 520 更窄)
centeredbooleanfalse垂直居中
maskbooleantrue遮罩
maskClosablebooleanfalse点击遮罩关闭(confirm 系列默认 false)
closeOnEscbooleantrueEsc 关闭
closablebooleanfalse显示右上角关闭按钮
okTextstring'确 定'OK 按钮文字
cancelTextstring'取 消'Cancel 按钮文字(仅 type='confirm' 渲染)
okType'primary' | 'danger' | 'default'按 type 推导OK 按钮类型
onOk() => void | Promise<unknown>OK 回调;返回 Promise 时按钮 loading 直到 resolve;reject 不关闭
onCancel() => void | Promise<unknown>Cancel 回调
afterClose() => void弹窗完全关闭并卸载 DOM 后触发(含离场动画完成)
zIndexnumber透传 Modal zIndex
wrapClassNamestring透传 Modal wrapClassName

ModalFuncReturn

字段类型说明
destroy() => void强制关闭并卸载
update(updater: Partial<ModalFuncOptions> | ((prev) => Partial<...>)) => void更新部分选项(合并,不替换)

API

Props

参数类型默认值说明
visiblebooleanfalse是否可见(支持 v-model:visible
titlestring''标题(也可用 title slot 自定义)
widthnumber | string520宽度,数字为 px
closableboolean | { closeIcon?: VNode | string; disabled?: boolean; ariaLabel?: string }true关闭按钮配置;对象形支持自定义图标 / 禁用 / aria-label
maskClosablebooleantrue点击蒙层是否关闭
closeOnEscbooleantrue按 Esc 是否关闭
centeredbooleanfalse是否垂直居中显示
maskbooleantrue是否显示蒙层
okTextstring'确 定'确认按钮文案
cancelTextstring'取 消'取消按钮文案
okType'primary' | 'danger' | 'default''primary'确认按钮类型
confirmLoadingbooleanfalse确认按钮加载态
footerstring | VNode | null | undefined--底部按钮区:null 隐藏;string / VNode 直接渲染
destroyOnClosebooleanfalse关闭时销毁内部内容(与 keepAlive 互斥)
keepAlivebooleanfalse即使未打开也保留 DOM(与 destroyOnClose 互斥)
wrapClassNamestring--自定义根节点 class
transitionNamestring--自定义 Transition 名(空走内置 -zoom
maskTransitionNamestring--mask 自定义 Transition 名(空走内置 -mask-fade
focusTriggerAfterClosebooleantrue关闭后聚焦回打开前的触发元素
appendToBodybooleantrue是否把浮层 Teleport 到 document.body
zIndexnumber1000z-index

Events

事件名回调签名触发时机
update:visible(visible: boolean)显示状态变化(v-model:visible)
after-open-change(open: boolean)打开 / 关闭动画完成后触发(immediate watch,首次 false)
ok()点击确认按钮
cancel()点击取消 / 关闭 / Esc
close()关闭过程中(先于 cancel)
open()开始展开
opened()展开动画完成
closed()收起动画完成

Slots

名称slot 参数说明
default-弹窗内容
title-自定义标题区
footer{ ok, cancel }自定义底部按钮(优先级高于 footer prop)
close-icon-自定义关闭图标(优先级高于 closable.closeIcon

Released under the MIT License.