更新记录

1.0.0(2026-06-01)

v1.0.0 - 初始版本

  • 支持基础弹框功能
  • 支持自定义样式(圆角、背景、按钮颜色)
  • 支持插槽内容嵌入
  • 支持输入框模式
  • 支持多种动画效果(fade/scale/slide-up)
  • 支持 Promise API 调用方式
  • 支持滚动穿透处理
  • 跨平台兼容(App/小程序/H5)

平台兼容性

uni-app(3.7.9)

Vue2 Vue3 Chrome Safari app-vue app-nvue Android iOS 鸿蒙
√ √ √ √ √ - √ √ √
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 小红书小程序 快应用-华为 快应用-联盟
√ √ √ √ √ √ √ √ √ √ - -

其他

多语言 暗黑模式 宽屏模式 蒸汽模式
× × √ ×

simple-dialog-pro

一款功能强大、样式优雅的自定义弹框组件,专为 uni-app 框架设计。

为什么需要自定义弹框组件?

官方提供的 uni.showModal 虽然简单,但存在明显的局限性:

限制 uni.showModal simple-dialog-pro
样式可控性 ❌ 样式固定,无法自定义 ✅ 完全自定义样式
内容灵活性 ❌ 仅支持文本 ✅ 支持插槽嵌入任意内容
交互功能 ❌ 功能受限 ✅ 支持输入框、自定义按钮等
动画效果 ❌ 无 ✅ 多种动画效果可选
跨平台体验 ❌ 各平台表现不一致 ✅ 统一体验

特性

  • ✅ 完全自定义样式 - 圆角、背景色、按钮颜色、动画效果均可配置
  • ✅ 灵活的内容区域 - 通过插槽嵌入任何自定义内容(图片、表单、组件等)
  • ✅ Promise 调用方式 - 支持 .then() / .catch() 语法,代码更优雅
  • ✅ 跨平台兼容 - 完美支持 App(iOS/Android)、微信小程序、支付宝小程序、H5
  • ✅ 滚动穿透处理 - 弹框打开时自动禁止背景页面滚动
  • ✅ 遮罩层控制 - 支持自定义透明度、点击关闭等设置
  • ✅ 多动画效果 - 淡入淡出、缩放、底部滑入等动画效果
  • ✅ 输入框模式 - 支持在弹框内输入内容并获取输入值
  • ✅ TypeScript 支持 - 提供完整的类型定义

安装

方式一:直接复制(推荐)

将 simple-dialog-pro 组件文件夹复制到项目的 components 目录下即可使用(遵循 easycom 规范,无需手动引入)。

方式二:npm 安装(待发布)

npm install simple-dialog-pro --save

使用方式

基础用法

<template>
  <view class="container">
    <button @click="showDialog = true">打开弹框</button>

    <simple-dialog-pro 
      v-model:visible="showDialog"
      title="提示"
      content="这是一个基础的弹框组件,支持标题、内容和双按钮。"
      @confirm="handleConfirm"
      @cancel="handleCancel"
    />
  </view>
</template>

<script setup>
import { ref } from 'vue'

const showDialog = ref(false)

const handleConfirm = () => {
  console.log('用户点击了确定')
  showDialog.value = false
}

const handleCancel = () => {
  console.log('用户点击了取消')
  showDialog.value = false
}
</script>

自定义内容(插槽)

通过插槽可以嵌入任何自定义内容:

<template>
  <simple-dialog-pro 
    v-model:visible="showDialog" 
    title="自定义内容"
    :showCancel="true"
  >
    <view class="custom-content">
      <view class="icon-wrapper">
        <text class="icon-text">🎉</text>
      </view>
      <text class="custom-title">恭喜您!</text>
      <text class="custom-desc">这是自定义内容区域,可以嵌入任何组件</text>
      <view class="custom-features">
        <view class="feature-item">
          <text class="feature-icon">✓</text>
          <text class="feature-text">支持图片</text>
        </view>
        <view class="feature-item">
          <text class="feature-icon">✓</text>
          <text class="feature-text">支持表单</text>
        </view>
      </view>
    </view>
  </simple-dialog-pro>
</template>

<style lang="scss" scoped>
.custom-content {
  text-align: center;
  padding: 20rpx 0;
}

.icon-wrapper {
  width: 100rpx;
  height: 100rpx;
  background: linear-gradient(135deg, #1677FF 0%, #4080FF 100%);
  border-radius: 50%;
  display: flex;
  align-items: center;
  justify-content: center;
  margin: 0 auto 20rpx;
}

.icon-text {
  font-size: 48rpx;
}

.custom-title {
  font-size: 32rpx;
  font-weight: 600;
  color: #333;
  display: block;
  margin-bottom: 10rpx;
}

.custom-desc {
  font-size: 26rpx;
  color: #666;
  display: block;
  line-height: 1.6;
}

.custom-features {
  margin-top: 30rpx;
  display: flex;
  justify-content: center;
  gap: 40rpx;
}

.feature-item {
  display: flex;
  align-items: center;
  gap: 8rpx;
}

.feature-icon {
  width: 36rpx;
  height: 36rpx;
  background: #1677FF;
  color: #fff;
  border-radius: 50%;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 20rpx;
}

.feature-text {
  font-size: 24rpx;
  color: #666;
}
</style>

Promise 调用方式

// 在组件中使用
this.$dialog.alert({
  title: '提示',
  content: '这是一个提示框'
}).then(() => {
  console.log('用户点击了确定')
})

this.$dialog.confirm({
  title: '确认操作',
  content: '确定要删除这条记录吗?'
}).then(() => {
  console.log('用户点击了确定')
}).catch(() => {
  console.log('用户点击了取消')
})

this.$dialog.prompt({
  title: '输入信息',
  content: '请输入您的姓名',
  inputPlaceholder: '请输入姓名'
}).then((value) => {
  console.log('用户输入:', value)
}).catch(() => {
  console.log('用户点击了取消')
})

Props

参数 类型 默认值 必填 说明
visible Boolean false 是 显示/隐藏控制(支持 v-model)
title String '' 否 标题文本
content String '' 否 内容文本,当使用插槽时此属性无效
showCancel Boolean true 否 是否显示取消按钮
cancelText String '取消' 否 取消按钮文字
confirmText String '确定' 否 确认按钮文字
confirmColor String '#1677FF' 否 确认按钮文字颜色
cancelColor String '#666666' 否 取消按钮文字颜色
maskOpacity Number 0.5 否 遮罩层透明度(0-1)
maskClose Boolean true 否 点击遮罩层是否关闭弹框
animationType String 'fade' 否 动画类型:fade(淡入淡出)、scale(缩放)、slide-up(底部滑入)
animationDuration Number 300 否 动画时长(毫秒)
showInput Boolean false 否 是否显示输入框
inputPlaceholder String '' 否 输入框占位符
inputType String 'text' 否 输入框类型:text、number、password
inputValue String '' 否 输入框初始值
autoFocus Boolean false 否 输入框是否自动聚焦
preventScroll Boolean true 否 是否阻止背景页面滚动
beforeClose Function null 否 关闭前回调,返回 false 可阻止关闭

Events

事件名 说明 参数
confirm 点击确定按钮时触发 inputValue(当 showInput 为 true 时返回输入值)
cancel 点击取消按钮时触发 无
close 弹框关闭时触发(无论点击确定还是取消) type('confirm' 或 'cancel')
update:visible 更新 visible 状态(v-model 自动处理) false

示例

单按钮弹框(Alert)

<simple-dialog-pro 
  v-model:visible="show"
  title="操作成功"
  content="您的操作已完成"
  :showCancel="false"
  @confirm="handleConfirm"
/>

带输入框的弹框(Prompt)

<simple-dialog-pro 
  v-model:visible="show"
  title="请输入信息"
  content="请在下方输入框中输入您的信息"
  :showInput="true"
  inputPlaceholder="请输入内容..."
  inputType="text"
  @confirm="(value) => handleInput(value)"
  @cancel="handleCancel"
/>

自定义按钮颜色

<simple-dialog-pro 
  v-model:visible="show"
  title="自定义颜色"
  content="确认按钮使用了自定义颜色"
  confirmColor="#FF6B6B"
  cancelColor="#999999"
/>

禁止点击遮罩关闭

<simple-dialog-pro 
  v-model:visible="show"
  title="重要提示"
  content="此操作需要您明确确认"
  :maskClose="false"
/>

底部滑入动画

<simple-dialog-pro 
  v-model:visible="show"
  title="底部滑入"
  content="弹框从底部滑入,类似 ActionSheet 效果"
  animationType="slide-up"
/>

缩放动画

<simple-dialog-pro 
  v-model:visible="show"
  title="缩放效果"
  content="弹框从中心缩放显示"
  animationType="scale"
/>

API 方法

$dialog.alert(options)

显示一个只有确认按钮的弹框

参数:

参数 类型 默认值 说明
title String '' 标题
content String '' 内容
confirmText String '确定' 确认按钮文字
confirmColor String '#1677FF' 确认按钮颜色
maskOpacity Number 0.5 遮罩透明度
animationType String 'fade' 动画类型

返回值:Promise,resolve 表示点击确定

示例:

this.$dialog.alert({
  title: '提示',
  content: '这是一个提示'
}).then(() => {
  console.log('用户点击了确定')
})

$dialog.confirm(options)

显示一个带有确认和取消按钮的弹框

参数:

参数 类型 默认值 说明
title String '' 标题
content String '' 内容
cancelText String '取消' 取消按钮文字
confirmText String '确定' 确认按钮文字
cancelColor String '#666' 取消按钮颜色
confirmColor String '#1677FF' 确认按钮颜色
maskOpacity Number 0.5 遮罩透明度
maskClose Boolean true 点击遮罩是否关闭
animationType String 'fade' 动画类型

返回值:Promise,resolve 表示点击确定,reject 表示点击取消

示例:

this.$dialog.confirm({
  title: '确认删除',
  content: '确定要删除这条记录吗?'
}).then(() => {
  console.log('用户确认删除')
}).catch(() => {
  console.log('用户取消删除')
})

$dialog.prompt(options)

显示一个带有输入框的弹框

参数:

参数 类型 默认值 说明
title String '' 标题
content String '' 内容
inputPlaceholder String '' 输入框占位符
inputType String 'text' 输入框类型
cancelText String '取消' 取消按钮文字
confirmText String '确定' 确认按钮文字
confirmColor String '#1677FF' 确认按钮颜色
maskOpacity Number 0.5 遮罩透明度
animationType String 'fade' 动画类型

返回值:Promise,resolve 传入输入值,reject 表示点击取消

示例:

this.$dialog.prompt({
  title: '输入姓名',
  content: '请输入您的姓名',
  inputPlaceholder: '请输入姓名'
}).then((value) => {
  console.log('用户输入:', value)
}).catch(() => {
  console.log('用户取消')
})

注意事项

滚动穿透问题

弹框打开时,背景页面可能会继续滚动,这是移动端常见的问题。simple-dialog-pro 默认已经处理了这个问题(preventScroll: true),但在某些特殊情况下可能需要额外处理:

<simple-dialog-pro 
  v-model:visible="show"
  :preventScroll="true"
/>

微信小程序特殊处理

在微信小程序中,组件根节点的点击事件可能需要特殊处理,simple-dialog-pro 已经做了兼容处理,使用 catchtouchmove 来防止滚动穿透。

遮罩层点击穿透

在 App 端,如果不处理,点击遮罩层的触摸事件可能会穿透到下方页面。simple-dialog-pro 使用 catchtap 来拦截点击事件。

多弹框同时出现

如果需要同时显示多个弹框,simple-dialog-pro 会自动处理层级关系,后弹出的弹框会覆盖前面的。

兼容性

平台 支持情况 说明
微信小程序 ✅ 完全支持 已测试
支付宝小程序 ✅ 完全支持 已测试
H5 ✅ 完全支持 已测试
App(iOS) ✅ 完全支持 已测试
App(Android) ✅ 完全支持 已测试
百度小程序 ✅ 支持 理论支持,未测试
QQ 小程序 ✅ 支持 理论支持,未测试

版本历史

v1.0.0

  • 初始版本
  • 支持基础弹框功能
  • 支持自定义样式
  • 支持插槽内容
  • 支持输入框模式
  • 支持多种动画效果
  • 支持 Promise API

开发说明

目录结构

simple-dialog-pro/
├── simple-dialog-pro.vue    # 组件核心文件
├── index.js                 # 插件入口(提供 Promise API)
├── README.md                # 组件文档
└── package.json             # 组件配置

开发环境

  • UniApp CLI
  • Vue 3
  • TypeScript(可选)

构建命令

# 开发模式
npm run dev

# 生产构建
npm run build

许可证

MIT License

贡献

欢迎提交 Issue 和 Pull Request!

联系方式

如有问题或建议,请通过以下方式联系:

  • 提交 Issue:[GitHub Issues]()
  • 邮箱:support@example.com

隐私、权限声明

1. 本插件需要申请的系统权限列表:

无

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集任何数据

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

无

暂无用户评论。