# uni-modal
**Repository Path**: ipenge/uni-modal
## Basic Information
- **Project Name**: uni-modal
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: MulanPSL-2.0
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2025-12-28
- **Last Updated**: 2025-12-28
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# UniApp Modal 组件 (Vue3 + TypeScript)
一个功能完善、高度可定制的 UniApp 弹窗组件,支持受控模式,内置防页面滚动功能。
## ✨ 特性
- ✅ **Vue3 + TypeScript**: 完整的类型支持,优秀的开发体验
- ✅ **受控组件**: 通过 `v-model:visible` 完全控制弹窗状态
- ✅ **防页面滚动**: 弹窗显示时自动锁定页面滚动,避免交互冲突
- ✅ **高度可定制**: 支持自定义样式、按钮、内容等
- ✅ **插槽支持**: 支持自定义内容和底部按钮
- ✅ **多端兼容**: 支持 H5、小程序、App 等多端
- ✅ **动画效果**: 平滑的进入退出动画
- ✅ **加载状态**: 支持确认按钮加载状态
## 📦 安装
直接将组件文件复制到你的项目中:
```
src/
├── components/
│ └── Modal/
│ ├── index.vue # 主组件
│ └── index.ts # 类型导出
└── pages/
└── index/
└── index.vue # 示例页面
```
## 🔧 基础用法
```vue
```
## 📝 Props
| 属性 | 类型 | 默认值 | 说明 |
|------|------|--------|------|
| visible | `boolean` | `false` | **必填**,控制弹窗显示/隐藏 |
| title | `string` | `'提示'` | 标题 |
| content | `string` | `''` | 内容(仅在无插槽时显示) |
| showHeader | `boolean` | `true` | 是否显示头部 |
| showClose | `boolean` | `false` | 是否显示关闭按钮 |
| showFooter | `boolean` | `true` | 是否显示底部 |
| showCancel | `boolean` | `true` | 是否显示取消按钮 |
| showConfirm | `boolean` | `true` | 是否显示确认按钮 |
| cancelText | `string` | `'取消'` | 取消按钮文字 |
| confirmText | `string` | `'确定'` | 确认按钮文字 |
| confirmLoading | `boolean` | `false` | 确认按钮加载状态 |
| width | `string \| number` | `'80%'` | 弹窗宽度(支持 rpx 或百分比) |
| maxHeight | `string \| number` | `'60vh'` | 弹窗最大高度 |
| borderRadius | `string \| number` | `'16rpx'` | 圆角 |
| bgColor | `string` | `'#ffffff'` | 背景色 |
| closeOnClickOverlay | `boolean` | `true` | 点击遮罩是否关闭 |
| disableScroll | `boolean` | `true` | 是否禁用页面滚动 |
## 🎨 Events
| 事件名 | 说明 | 回调参数 |
|--------|------|----------|
| update:visible | 弹窗状态变化 | `(value: boolean)` |
| confirm | 点击确认按钮 | `()` |
| cancel | 点击取消按钮 | `()` |
| close | 点击关闭按钮或遮罩 | `()` |
| open | 弹窗打开时触发 | `()` |
## 🎯 插槽
### 默认插槽
替换整个内容区域:
```vue
这里是自定义内容
```
### Footer 插槽
自定义底部按钮:
```vue
```
## 🚀 高级用法
### 1. 自定义样式
```vue
```
### 2. 确认按钮加载状态
```vue
```
### 3. 仅显示确认按钮
```vue
```
### 4. 完全自定义内容
```vue
```
## 🔒 防页面滚动机制
本组件通过以下方式确保弹窗显示时页面无法滚动:
1. **触摸事件阻止**: 使用 `@touchmove.stop.prevent` 阻止事件冒泡
2. **CSS 控制**: 在 H5 端通过修改 `body.overflow` 属性
3. **组件隔离**: 设置 `touch-action: none` 防止穿透滚动
## 📱 多端兼容性
| 平台 | 兼容性 | 说明 |
|------|--------|------|
| H5 | ✅ 完美支持 | 包括移动端和桌面端 |
| 微信小程序 | ✅ 完美支持 | 包括 iOS 和 Android |
| App (iOS/Android) | ✅ 完美支持 | 原生体验 |
| 支付宝小程序 | ✅ 支持 | 基础功能 |
| 其他小程序 | ✅ 支持 | 基础功能 |
## 🎯 最佳实践
### 1. 状态管理
始终使用 `v-model:visible` 来控制弹窗状态,保持单向数据流:
```vue
```
### 2. 异步操作
处理异步操作时,使用 `confirmLoading` 提供用户反馈:
```vue
```
### 3. 内容过长处理
当内容过长时,组件会自动在内容区域显示滚动条,不会影响弹窗整体布局。
### 4. 避免嵌套弹窗
尽量避免弹窗嵌套,如确需使用,请确保状态管理清晰。
## 🐛 常见问题
### Q: 为什么页面还是可以滚动?
A: 确保 `disableScroll` 设置为 `true`(默认值),并且在 H5 端检查是否有其他样式覆盖。
### Q: 小程序中防滚动失效?
A: 小程序端主要依赖 `@touchmove.stop.prevent`,确保没有其他组件阻止了事件冒泡。
### Q: 如何修改弹窗层级?
A: 组件默认 `z-index: 999`,如需调整,可通过全局 CSS 覆盖:
```css
.modal-overlay {
z-index: 1000 !important;
}
```
## 📄 许可
MIT License
## 🤝 贡献
欢迎提交 Issue 和 PR!
---
**开发愉快!** 🎉