VUE2实现事件驱动弹窗示例

网友投稿 333 2023-03-24


VUE2实现事件驱动弹窗示例

前几天想了解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}

prompt.vue

{{message}}

{{message}}

{{cancelText}}

{{okText}}

main.js

import {Alert,Prompt,Confirm} from '../lib/components/prompt/prompt.js'

Vue.prototype.Alert = function(text,okText) {

return Alert(text,okText)

};

Vue.prototype.Confirm = function(text,okText,cancelText) {

return Confirm(text,okText,cancelText)

};

Vue.prototype.Prompt = function(text,okText,inputType, defaultValue) {

return Prompt(text,okText,inputType, defaultValue)

};

component.vue:

inputName() {

this.Prompt('请输入名称','确认','text').then(res =>{

// do something use res

});

},


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:横向联网接口管理平台(横向联网系统)
下一篇:vue使用keep
相关文章

 发表评论

暂时没有评论,来抢沙发吧~