index.js 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. import { createApp } from 'vue'
  2. import Antd from 'ant-design-vue'
  3. // 导入组件
  4. import CodePreview from './BoxMask.vue'
  5. import snowy from '@/snowy'
  6. let codePreviewInstance = null
  7. let codePreviewApp = null
  8. /**
  9. * 初始化代码预览实例
  10. * @param {Object} fileInfo 文件信息
  11. * @param {Boolean} isEdit 是否可编辑
  12. * @param {Function} callback 回调函数
  13. */
  14. const initInstanceCodePreview = (fileInfo, isEdit, callback) => {
  15. const mountNode = document.createElement('div')
  16. codePreviewApp = createApp(CodePreview, {
  17. fileInfo,
  18. isEdit,
  19. callback
  20. })
  21. // 注册 Ant Design Vue 组件
  22. codePreviewApp.use(Antd)
  23. codePreviewApp.use(snowy)
  24. codePreviewInstance = codePreviewApp.mount(mountNode)
  25. return mountNode
  26. }
  27. /**
  28. * 代码预览 Promise 函数
  29. * @param {Object} obj 包含文件信息和编辑状态的对象
  30. * @returns {Promise} 抛出确认和取消回调函数
  31. */
  32. const showCodePreviewBox = (obj) => {
  33. // 非首次调用服务时,在 DOM 中移除上个实例
  34. if (codePreviewInstance !== null && codePreviewApp !== null) {
  35. codePreviewApp.unmount()
  36. codePreviewInstance = null
  37. codePreviewApp = null
  38. }
  39. let { fileInfo, isEdit } = obj
  40. return new Promise((resolve) => {
  41. const mountNode = initInstanceCodePreview(fileInfo, isEdit, (res) => {
  42. resolve(res)
  43. // 服务取消时卸载 DOM
  44. if (res === 'cancel' && codePreviewInstance !== null) {
  45. codePreviewApp.unmount()
  46. document.body.removeChild(mountNode)
  47. codePreviewInstance = null
  48. codePreviewApp = null
  49. }
  50. })
  51. document.body.appendChild(mountNode) // 挂载 DOM
  52. // 使用 setTimeout 确保组件已完全挂载
  53. setTimeout(() => {
  54. if (codePreviewInstance) {
  55. codePreviewInstance.visible = true // 打开代码预览遮罩层
  56. }
  57. }, 0)
  58. })
  59. }
  60. export default showCodePreviewBox