以以v-model与与promise两种方式实现两种方式实现vue弹窗组件弹窗组件
主要介绍了vue弹窗组件之两种方式v-model与promise,每种方式给大家介绍的非常详细,具有一定的参考借鉴价值,需
要的朋友可以参考下
最近公司有一个后台业务虽然也是写在了现有的后台系统中,但是之后要为这个业务单独拉出来新建一个后台系统,所以现有的后台系
统中的vue组件库,就不能用了(因为不知道将来的系统要基于什么组件库,以防给未来移植项目带来麻烦),这次业务中又遇到了弹窗的
功能,所以只能手动写一个了(虽然说弹窗组件很简单,也是想自己总结一下,有不对的地方也请指出),一开始用传统的props,$emit但
是觉得要接两个取消与确认的回调这块的逻辑分散了所以就用了promise两个回调的方式把两个回调写在了一起,并不一定好,算是提
供一种思路吧。
一一.概览概览
先看最后的调用方式
props $emit方式方式
<chat-modal ref="chat-modal" v-model="showModal" cancelText="取消" sureText="确认" title="弹窗标题" small @on-ok="onOK" @on-cancel="onCancel">
<div>slot的东西,想向弹窗中添加自定义的内容</div>
</chat-modal>
methods: {
display() {
this.showModal = true;//交互点击手动触发显示弹窗
},
onOK() {},//点击确认的回调
onCancel() {}//点击取消的回调
}
promise的回调方式的回调方式
<chat-modal ref="chat-modal"></chat-modal>
methods: {
display() {
this.$refs["chat-modal"].openModal({
title: "弹窗标题",
sureText: "确认",
cancelText: "取消"
}).then(res => {
//点击确认的回调
}, res => {
//点击取消的回调
})
}
}
第二种方式的好处就是把所有的逻辑都集中到了一个方法里。
二二.看下组件的源码看下组件的源码
tip: 样式有些烂...
<template>
<div>
<div class="shadow" v-show="showModal"></div>
<div class="modal" :class="{'smSize': otherText.small || small}" v-show="showModal">
<div class="header">{{ otherText.title || title}}</div>
<div class="body">
<slot></slot>
</div>
<div class="footer">
<div class="item success" id="sure" ref="sure" @click="makeSure" v-show="otherText.sureText || sureText">{{ otherText.sureText || sureText }}</div>
<div class="item red" id="cancel" ref="cancel" @click="makeCancel" v-show="otherText.cancelText || cancelText">{{ otherText.cancelText || cancelText }}</div>
</div>
</div>
</div>
</template>
<script>
//此组件提供两种调用方法,可以在组件上v-model一个表示是否显示弹窗的对话框,然后需要的一些值通过props传入,然后$emit在组件上@监听做回调
//第二中方法所有的传值回调都只需要在组件内部的一个方法调用然后在组件外部this.$refs[xxx].open调用然后.then触发回调,比上一种方便些
var initOtherText = {
sureText: "",
cancelText: "",
title: "",
small: false
};
export default {
props: {
title: {
type: String
},
sureText: {
type: String