confirm.js 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. // 全局确认弹窗服务:以编程式方式调用 app-confirm 组件
  2. import Vue from 'vue'
  3. import AppConfirm from '@/components/app-confirm/app-confirm.vue'
  4. let singletonVm = null
  5. function getInstance() {
  6. // 优先:尝试从根实例的 $refs 获取(所有平台,特别是 APP-PLUS)
  7. try {
  8. const app = getApp && getApp();
  9. const root = app && app.$vm;
  10. const viaRef = root && root.$refs && (root.$refs.AppConfirm || root.$refs.appConfirm);
  11. if (viaRef) return viaRef;
  12. } catch (e) {}
  13. // 其次:尝试从当前页面实例上获取(页面内也可能挂载了 AppConfirm)
  14. try {
  15. const pages = getCurrentPages && getCurrentPages();
  16. const current = pages && pages[pages.length - 1];
  17. const vm = current && current.$vm;
  18. const viaPage = vm && vm.$refs && (vm.$refs.AppConfirm || vm.$refs.appConfirm);
  19. if (viaPage) return viaPage;
  20. } catch (e) {}
  21. // H5 兜底:程序化创建并挂到 body
  22. if (singletonVm) return singletonVm
  23. const ConfirmCtor = Vue.extend(AppConfirm)
  24. const vm = new ConfirmCtor()
  25. vm.$mount()
  26. if (typeof document !== 'undefined' && document.body) {
  27. document.body.appendChild(vm.$el)
  28. }
  29. singletonVm = vm
  30. return vm
  31. }
  32. /**
  33. * 显示确认弹窗
  34. * @param {Object} options - 配置
  35. * @param {string} options.title - 标题
  36. * @param {string} options.content - 内容
  37. * @param {string} options.confirmText - 确认按钮文案
  38. * @param {string} options.cancelText - 取消按钮文案
  39. * @param {('default'|'danger')} options.type - 风格
  40. * @returns {Promise<boolean>} - 用户是否确认
  41. */
  42. export function confirm(options = {}) {
  43. const vm = getInstance()
  44. return vm.open(options)
  45. }
  46. export default { confirm }