更新记录

1.0.0(2026-06-01)

v1.0.0 - 初始版本

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

平台兼容性

uni-app(3.7.8)

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' 输入框类型:textnumberpassword
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. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

暂无用户评论。