我自己自定义了一套H5页面统一风格的弹窗组件,支持提示弹窗、确认弹窗、自定义内容弹窗,可插入表单、图片等任意元素,并支持自定义标题、图标和背景图。

目录
文件结构
compones/ |
快速开始
1. 已完成全局注册
在 main.js 中已自动注册 $modal 服务,所有页面均可直接使用 this.$modal:
// main.js(已完成配置) |
2. 页面中使用
只需两步:
<template> |
方式一:声明式组件
适合需要插入自定义内容(表单、列表等)的场景。
<template> |
方式二:编程式调用
适合简单的提示、确认场景,无需在 template 中写组件。
前置准备
<template> |
调用方法
// 提示弹窗 |
完整 Props 属性表
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
show |
Boolean | false |
控制弹窗显示/隐藏 |
mode |
String | 'alert' |
弹窗模式:alert / confirm / custom |
title |
String | '' |
标题文字 |
subtitle |
String | '' |
副标题描述文字 |
content |
String | '' |
文本内容(不使用插槽时生效) |
icon |
String | '' |
图片图标路径(优先级高于 iconType) |
iconType |
String | '' |
uni-icons 图标类型名 |
iconSize |
Number/String | 60 |
图标大小(rpx) |
iconColor |
String | '#3b82f6' |
图标颜色 |
bgImage |
String | '' |
顶部背景图片路径 |
headerGradient |
Array | ['#3b82f6','#60a5fa'] |
顶部渐变色 [起始色, 结束色] |
showHeader |
Boolean | true |
是否显示顶部区域 |
confirmText |
String | '确定' |
确认按钮文字 |
cancelText |
String | '取消' |
取消按钮文字 |
showConfirmButton |
Boolean | true |
是否显示确认按钮 |
showCancelButton |
Boolean | false |
是否显示取消按钮 |
confirmColor |
String | '' |
确认按钮自定义颜色 |
cancelColor |
String | '' |
取消按钮自定义颜色 |
maskCloseAble |
Boolean | true |
点击遮罩是否关闭 |
showClose |
Boolean | false |
是否显示右上角关闭按钮 |
closeSize |
Number/String | 20 |
关闭按钮图标大小 |
confirmLoading |
Boolean | false |
确认按钮 loading 状态 |
cancelLoading |
Boolean | false |
取消按钮 loading 状态 |
titleStyle |
Object | {} |
标题自定义样式 |
mode 模式说明
| 模式 | 说明 | 默认按钮 |
|---|---|---|
alert |
提示弹窗 | 仅显示「确定」按钮 |
confirm |
确认弹窗 | 显示「确定」+「取消」按钮 |
custom |
自定义模式 | 由使用者自行控制 |
Events 事件
| 事件名 | 说明 | 回调参数 |
|---|---|---|
confirm |
点击确认按钮时触发 | - |
cancel |
点击取消按钮或遮罩时触发 | - |
update:show |
show 值变化时触发(支持 .sync) | Boolean |
Slots 插槽
| 插槽名 | 说明 |
|---|---|
default |
内容区域默认插槽,可插入任意元素(表单、图片、列表等) |
footer |
底部按钮区域插槽,完全自定义底部按钮 |
footer 插槽示例
<CustomModal :show="show" title="自定义按钮"> |
使用示例
1. 基础提示弹窗
this.$modal.alert({ |

2. 确认弹窗
const confirmed = await this.$modal.confirm({ |

3. 成功/错误/警告弹窗
// 成功提示(绿色主题 + 勾选图标) |
错误提示作为例子展示

4. 带表单的自定义弹窗
<CustomModal |

5. 自定义底部按钮
<CustomModal :show="showFooterModal" title="订单操作" |

6. 带背景图的弹窗
<CustomModal |

7. Promise 异步用法
async handleDelete(item) { |

测试页面
项目已内置测试页面,包含所有弹窗类型的演示:
路径:pages/modaltest/modaltest.vue
访问方式:在浏览器中直接访问 #/pages/modaltest/modaltest
测试页面包含以下场景:
| 测试项 | 说明 |
|---|---|
| 基础提示弹窗 | 最简单的 alert 用法 |
| 确认弹窗 | 带确认/取消的 confirm 用法 |
| 成功提示 | 绿色主题成功弹窗 |
| 错误提示 | 红色主题错误弹窗 |
| 警告提示 | 橙色主题警告弹窗 |
| 自定义表单弹窗 | 插入 u-form 表单的完整示例 |
| 带背景图弹窗 | 使用 bgImage 自定义背景 |
| 多按钮弹窗 | 使用 footer 插槽自定义底部 |
| 编程式 Promise | async/await 异步调用示例 |
样式定制
组件使用 scoped 样式,如需全局覆盖,可在 App.vue 中使用 ::v-deep:
::v-deep .custom-modal-wrapper { |
常见问题
Q: 为什么弹窗不显示?
A: 确保已在页面 template 中添加 <GlobalModal />(编程式),或正确绑定 :show(声明式)。
Q: 如何在弹窗关闭后执行操作?
A: 监听 @cancel 事件,或使用 $modal.confirm() 的 Promise 返回值。
Q: 如何阻止点击遮罩关闭?
A: 设置 :mask-close-able="false"。
Q: 编程式弹窗可以插入自定义内容吗?
A: 编程式弹窗仅支持文本内容。如需插入表单等自定义内容,请使用声明式 <CustomModal> 组件。
最后附上源码
compones/CustomModal.vue
<template> |
compones/GlobaModal.vue
<template> |
utils/modal.js
/** |
utils/modal-mixin.js
/** |
pages/modaltest/modaltest.vue
<template> |
说些什么吧!