VUE2实现事件驱动弹窗示例
前几天想了解vue如何写弹窗组件 有以下两种可取的写法: 1.状态管理 如果弹窗组件放在根组件,使用vuex来管理组件的show和hide。放在组件内,通过增加v-show或v-if来控制,可结合slot,定义不同需求的弹窗 2.事件管理 注册一个全局事件来打开弹窗,传入需展示的文字和相关的逻辑控制,可结合promise,实现异步 觉得对用像confirme和propmt这类弹窗,还是事件驱动的好。最好就是能使用promise回调。 于是手痒就写了一个。下面是代码。 propmt.js 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,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,function() { instance.show = false; resolve(instance.inputValue); }) }) }; export {Alert,Confirm,Prompt} prompt.vue
.confirm-enter-active {
transition: all .2s;
}
.confirm-leave-active { .confirm-leave-to { .confirm-enter { .confirm { {{message}}
{{message}}
main.js Vue.prototype.Alert = function(text,okText) {
return Alert(text,okText) }; Vue.prototype.Confirm = function(text,cancelText) { return Confirm(text,cancelText) }; Vue.prototype.Prompt = function(text,defaultValue) { return Prompt(text,defaultValue) }; component.vue: inputName() { 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程之家。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |