// 全局确认弹窗服务:以编程式方式调用 app-confirm 组件 import Vue from 'vue' import AppConfirm from '@/components/app-confirm/app-confirm.vue' let singletonVm = null function getInstance() { // 优先:尝试从根实例的 $refs 获取(所有平台,特别是 APP-PLUS) try { const app = getApp && getApp(); const root = app && app.$vm; const viaRef = root && root.$refs && (root.$refs.AppConfirm || root.$refs.appConfirm); if (viaRef) return viaRef; } catch (e) {} // 其次:尝试从当前页面实例上获取(页面内也可能挂载了 AppConfirm) try { const pages = getCurrentPages && getCurrentPages(); const current = pages && pages[pages.length - 1]; const vm = current && current.$vm; const viaPage = vm && vm.$refs && (vm.$refs.AppConfirm || vm.$refs.appConfirm); if (viaPage) return viaPage; } catch (e) {} // H5 兜底:程序化创建并挂到 body if (singletonVm) return singletonVm const ConfirmCtor = Vue.extend(AppConfirm) const vm = new ConfirmCtor() vm.$mount() if (typeof document !== 'undefined' && document.body) { document.body.appendChild(vm.$el) } singletonVm = vm return vm } /** * 显示确认弹窗 * @param {Object} options - 配置 * @param {string} options.title - 标题 * @param {string} options.content - 内容 * @param {string} options.confirmText - 确认按钮文案 * @param {string} options.cancelText - 取消按钮文案 * @param {('default'|'danger')} options.type - 风格 * @returns {Promise} - 用户是否确认 */ export function confirm(options = {}) { const vm = getInstance() return vm.open(options) } export default { confirm }