import Modal from 'ant-design-vue/es/modal' export default (Vue) => { function dialog (component, componentProps, modalProps) { const _vm = this modalProps = modalProps || {} if (!_vm || !_vm._isVue) { return } let dialogDiv = document.querySelector('body>div[type=dialog]') if (!dialogDiv) { dialogDiv = document.createElement('div') dialogDiv.setAttribute('type', 'dialog') document.body.appendChild(dialogDiv) } const handle = function (checkFunction, afterHandel) { if (checkFunction instanceof Function) { const res = checkFunction() if (res instanceof Promise) { res.then(c => { c && afterHandel() }) } else { res && afterHandel() } } else { // checkFunction && afterHandel() checkFunction || afterHandel() } } const dialogInstance = new Vue({ data () { return { visible: true } }, router: _vm.$router, store: _vm.$store, mounted () { this.$on('close', (v) => { this.handleClose() }) }, methods: { handleClose () { handle(this.$refs._component.onCancel, () => { this.visible = false this.$refs._component.$emit('close') this.$refs._component.$emit('cancel') dialogInstance.$destroy() }) }, handleOk () { handle(this.$refs._component.onOK || this.$refs._component.onOk, () => { this.visible = false this.$refs._component.$emit('close') this.$refs._component.$emit('ok') dialogInstance.$destroy() }) } }, render: function (h) { const that = this const modalModel = modalProps && modalProps.model if (modalModel) { delete modalProps.model } const ModalProps = Object.assign({}, modalModel && { model: modalModel } || {}, { attrs: Object.assign({}, { ...(modalProps.attrs || modalProps) }, { visible: this.visible }), on: Object.assign({}, { ...(modalProps.on || modalProps) }, { ok: () => { that.handleOk() }, cancel: () => { that.handleClose() } }) }) const componentModel = componentProps && componentProps.model if (componentModel) { delete componentProps.model } const ComponentProps = Object.assign({}, componentModel && { model: componentModel } || {}, { ref: '_component', attrs: Object.assign({}, { ...((componentProps && componentProps.attrs) || componentProps) }), on: Object.assign({}, { ...((componentProps && componentProps.on) || componentProps) }) }) return h(Modal, ModalProps, [h(component, ComponentProps)]) } }).$mount(dialogDiv) } Object.defineProperty(Vue.prototype, '$dialog', { get: () => { return function () { dialog.apply(this, arguments) } } }) }