| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- // 全局确认弹窗服务:以编程式方式调用 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<boolean>} - 用户是否确认
- */
- export function confirm(options = {}) {
- const vm = getInstance()
- return vm.open(options)
- }
- export default { confirm }
|