使用 函数 的形式 调用 el-dialog

629 阅读1分钟

在已经成型的项目中,如果没有 全局的弹框方法 并且模块 业务逻辑比较复杂,弹框很多,使用 el-dialog 真的很容易增加页面 的复杂度。这里对el-dialog 进行了一层封装方法,还有很多不足,希望指正。

./index.js

import Vue from 'vue'

import Main from './index.vue'

const dialog = function(options) {

options = { ...options } || {}

Vue.component('dialogSlot', options.component)

delete options.component

const dialogConstructor = Vue.extend(Main)

const instance = new dialogConstructor({

data: options

})

instance.$mount()

return instance

}

export default dialog

./index.vue

<el-dialog class="dialog" :width="width" append-to-body :title="title" :visible="visible" @close="close">

<dialogSlot ref="dialog" :data="data" @receiveData="receiveFunc" />

export default {

data() {

return {

title: '',

data: {},

width: '50%',

visible: false, // visible 请不要传值

sureBtn: () => {},

data1: null

}

},

created() {

setTimeout(() => {

this.visible = true

})

},

methods: {

receiveFunc(data) {

this.data1 = data

},

close() {

this.visible = false

setTimeout(() => {

this.$el.remove()

}, 500)

},

async sure() {

let { sureBtn, data, data1, $refs } = this

let defineDialog = $refs.dialog

if (!data1) {

data1 = defineDialog

defineDialog = undefined

}

let back = sureBtn(data, data1, defineDialog)

if (back instanceof Promise) {

back = await back

}

if (back) this.close()

}

}

}

.dialog{

.el-dialog__header{

border-bottom:1px solid #EBEEF5;

padding: 16px 20px;

}

.el-dialog__footer{

border-top:1px solid #EBEEF5;

padding: 16px 0;

margin: 0 20px;

}

}