import Vue from 'vue' // 导入组件 import ContextMenu from './Box.vue' // 使用基础 Vue 构造器,创建一个“子类” const ContextMenuConstructor = Vue.extend(ContextMenu) let contextMenuInstance = null /** * 初始化右键菜单实例 * @param {string} selectedFile 文件信息,如果此值为 undefined,证明是在空白触右键 * @param {object} domEvent 当前右键点击的元素 * @param {} serviceEl 调用当前服务的组件实例 * @param {} callType 是否组件本身 */ const initInstanceContextMenu = ( selectedFile, domEvent, serviceEl, callType ) => { contextMenuInstance = new ContextMenuConstructor({ el: document.createElement('div'), data() { return { selectedFile, domEvent, serviceEl, callType } } }) } /** * 右键菜单 Promise 函数 * @returns {Promise} 抛出确认和取消回调函数 */ const showContextMenuBox = (obj) => { // 非首次调用服务时,在 DOM 中移除上个实例 if (contextMenuInstance !== null) { document.body.removeChild(contextMenuInstance.$el) } let { selectedFile, domEvent, serviceEl, callType } = obj return new Promise((reslove) => { initInstanceContextMenu(selectedFile, domEvent, serviceEl, callType) contextMenuInstance.callback = (res) => { reslove(res) // 服务取消时卸载 DOM if (res === 'cancel' && contextMenuInstance !== null) { document.body.removeChild(contextMenuInstance.$el) contextMenuInstance = null } } document.body.appendChild(contextMenuInstance.$el) // 挂载 DOM Vue.nextTick(() => { contextMenuInstance.handleOpenContextMenu() // 开始计算右键菜单需要显示的位置 }) }) } // 添加关闭事件 showContextMenuBox.close = () => { if (contextMenuInstance !== null) { document.body.removeChild(contextMenuInstance.$el) contextMenuInstance = null } } export default showContextMenuBox