前几天想了解vue如何写弹窗组件

有以下两种可取的写法:
1.状态管理 如果弹窗组件放在根组件,使用vuex来管理组件的show和hide。放在组件内,通过增加v-show或v-if来控制,可结合slot,定义不同需求的弹窗
2.事件管理 注册一个全局事件来打开弹窗,传入需展示的文字和相关的逻辑控制,可结合promise,实现异步
觉得对用像confirme和propmt这类弹窗,还是事件驱动的好。最好就是能使用promise回调。
于是手痒就写了一个。下面是代码。
propmt.js
import Vue from 'vue'
import promptComponent from './prompt.vue' // 引入弹窗的vue文件
const promptConstructor = Vue.extend(promptComponent); // 注册组件
let instance = new promptConstructor().$mount(''); // 获得组件的实例
document.body.appendChild(instance.$el); // 将组件的element插入到body中
const Alert = (text,okText)=>{
if(instance.show === true) { //防止多次触发
return;
}
// 为弹窗数据赋值
instance.show = true;
instance.isAlert = true;
instance.okText = okText||'确定';
instance.message = text;
//返回一个promise对象,并为按钮添加事件监听
return new Promise(function(resolve,reject) {
instance.$refs.okBtn.addEventListener('click',function() {
instance.show = false;
resolve(true);
})
})
};
const Confirm = (text,okText,cancelText)=>{
if(instance.show === true) {
return;
}
instance.show = true;
instance.okText = okText||'确定';
instance.cancelText = cancelText||'取消';
instance.message = text;
return new Promise(function(resolve,reject) {
instance.$refs.cancelBtn.addEventListener('click',function() {
instance.show = false;
resolve(false);
});
instance.$refs.okBtn.addEventListener('click',function() {
instance.show = false;
resolve(true);
})
})
};
const Prompt = (text,okText,inputType, defaultValue)=>{
if(instance.show === true) {
return;
}
instance.show = true;
instance.isPrompt = true;
instance.okText = okText||'确定';
instance.message = text;
instance.inputType = inputType || 'text';
instance.inputValue = defaultValue || '';
return new Promise(function(resolve,reject) {
instance.$refs.okBtn.addEventListener('click',function() {
instance.show = false;
resolve(instance.inputValue);
})
})
};
export {Alert,Confirm,Prompt}
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。