# ayy-modal
**Repository Path**: osaiyoyou/ayy-modal
## Basic Information
- **Project Name**: ayy-modal
- **Description**: uniapp 全局弹窗
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 4
- **Forks**: 2
- **Created**: 2024-08-28
- **Last Updated**: 2025-10-21
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 全局弹窗组件(支持vue2和vue3)
#### 不依赖任何其他第三方库(集成门槛低)
##### 支持市面上不支持的,确很想支持的功能。
1. 支持h5 | app | 小程序平台
2. 支持弹窗缓存池,再多弹窗没处理也不怕,同一时间只显示一个弹框,按先进后出顺序处理弹窗业务
3. 缓存池支持弹窗去重,定义相同弹窗key,再多的接口401错误也只弹一个重新登录窗体。
4. 支持单行输入及多行输入
5. 标题,内容,按钮支持完全样式修改
6. 内容支持富文本渲染
7. 支持异步业务操作
8. 支持静默删除弹窗(选择性删除及全量删除)
9. 支持动态更新弹窗数据
#### 详细集成文档也可参考[源地址](https://gitee.com/osaiyoyou/ayy-modal)
- 插件npm依赖 (package.json中添加依赖)
```
"dependencies": {
"ayy-modal": "git+https://gitee.com/osaiyoyou/ayy-modal.git#master"
}
```
- 插件npm安装与更新
```
首次安装:npm i
后续更新:npm i ayy-modal
```
- 组件全局引入(main.js)
```
// #ifdef APP || H5 || MP
import ayyModal from '@/node_modules/ayy-modal/components/ayy-modal/ayy-modal.js'
//ayyModal.config.confirmColor = '#00B4BF' //样式配置表配置需要放在最前面配置才会生效
//ayyModal.config.footerTemple = 'temp1' //全局配置底部操作按钮模板,默认为‘default’模板
// #endif
```
- pages.json 组件easycom全局引入
```
"easycom": {
"autoscan": true,
"custom": {
"ayy-modal": "ayy-modal/components/ayy-modal/ayy-modal.vue"
}
}
```
- pages.json 注册页面路由(App端才需要,注意pages.json对json有严格校验,最后一个节点不允许有"," 所以以下代码{}前后是否需要加逗号看你将下面代码加在那个位置)
```
// #ifdef APP
{
// #ifdef VUE2
"path": "ayy-modal/components/ayy-modal/ayy-modal",
// #endif
// #ifdef VUE3
"path": "node_modules/ayy-modal/components/ayy-modal/ayy-modal",
// #endif
"style": {
"navigationStyle": "custom",
"backgroundColor": "transparent",
"disableSwipeBack": true,
"app-plus": {
"animationType": "fade-in",
"background": "transparent",
"popGesture": "none",
"bounce": "none"
}
}
},
// #endif
```
- 如果需要支持小程序,那么需要添加如下配置(验证了支付宝小程序无法使用vue-inset-loader动态添加标签,所有支付宝若要使用可手动在需要弹窗的页面添加标签。其他小程序暂时未测试)
```
1、安装 vue-inset-loader,该插件主要是在每个页面将组件标签写入
npm install vue-inset-loader --save-dev
2、配置vue.config.js
const path = require('path')
module.exports = {
configureWebpack: {
module: {
rules: [{
test: /\.vue$/,
use: {
// loader: "vue-inset-loader"
//针对Hbuilder工具创建的uni-app项目
loader: path.resolve(__dirname,"./node_modules/vue-inset-loader")
}
}]
}
}
}
3、pages.json配置文件中添加insetLoader
// 所有页面注入组件
// #ifdef MP
"insetLoader": {
"config":{
"ayyModal": ""
},
// 全局配置
"label":["ayyModal"],
"rootEle":"view"
},
// #endif
```
- 特别注意,只有小程序端才需要以下处理。小程序端理论来讲弹窗不是全局的,是在每个页面都动态的写入了``,所以在做弹窗时确保弹窗容器实例是当前页面的ayy-modal实例才可以,实例切换大部分情况都内部都已经处理好了,无需关心,switchTab页面需要做特殊处理
```
//switchTab页面使用全局弹窗需要做如下处理
//手动再引入一次标签,标签标记一下ref值(不同switchTab页面标记不同ref值,以做区分),例如:
//第一个switchTab页面
onShow() {
uni.$ayyModal.initInstance(this.$refs.indexRef)
}
//第二个switchTab页面
onShow() {
uni.$ayyModal.initInstance(this.$refs.index2Ref)
}
```
- 使用示例(小程序端调用需确保页面挂载完成后再调用)
```
uni.$ayyModal.show({
title: "我是标题",
content: "我是内容"
})
uni.$ayyModal.show({
key: "LoginKey",
title: "我是标题",
content: "指定唯一标识key,相同key只渲染最后一个key弹窗"
})
uni.$ayyModal.show({
key: "LoginKey",
title: "我是标题2",
content: "指定唯一标识key,相同key只渲染最后一个key弹窗"
})
uni.$ayyModal.show({
key:"delete",
title: "我是标题",
content: "隐藏取消按钮",
showCancel: false,
})
uni.$ayyModal.show({
key:"delete1",
title: "使用富文本",
content: "我们都是中国人我们都是中国人我们都是中国人我们都是中国人",
contentMode: 'rich-text',
})
uni.$ayyModal.show({
title: "温馨提示",
content: "使用单行输入",
editable: true,
confirmFun: (data) => {
console.log(`inputText=>`+data.inputText)
//APP端confirmFun回调中若有页面跳转需要延迟一点点再跳转
setTimeout(() => {
uni.navigateTo({
url: '/pages/index/detail'
})
}, 10)
}
})
let vm = uni.$ayyModal.show({
title: "温馨提示",
content: "使用多行输入",
editable: true,
inputMode: 'textarea',
placeholderText: '请输入补充内容',
confirmFun: (data) => {
console.log(`inputText=>`+data.inputText)
}
})
uni.$ayyModal.show({
key: "sleep-pop",
title: "异步关闭弹窗",
content: "(已支持部分智能设备同步、手动填写)",
contentStyle: "color:#828282;font-size: 32rpx;line-height: 48rpx;",
asyncClose: true,//异步关闭窗口,需要自己调用remove接口关闭窗口(有页面跳转的需要先关闭弹窗再做页面跳转)
confirmFun: (data) => {
uni.$ayyModal.remove('sleep-pop')
uni.navigateTo({
url: '/pages/index/detail'
})
}
})
```
- 弹窗操作API
```
//删除单个弹窗
uni.$ayyModal.remove('delete')
//删除全部弹窗
uni.$ayyModal.removeAll()
//删除全部弹窗,排除的key不删除
uni.$ayyModal.removeAll("delete,delete1")
//修改弹窗内容(以标题为例)
vm.title = '12123123123'
uni.$ayyModal.update(vm)
```