| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- import { createApp } from 'vue'
- import Antd from 'ant-design-vue'
- // 导入组件
- import CodePreview from './BoxMask.vue'
- import snowy from '@/snowy'
- let codePreviewInstance = null
- let codePreviewApp = null
- /**
- * 初始化代码预览实例
- * @param {Object} fileInfo 文件信息
- * @param {Boolean} isEdit 是否可编辑
- * @param {Function} callback 回调函数
- */
- const initInstanceCodePreview = (fileInfo, isEdit, callback) => {
- const mountNode = document.createElement('div')
- codePreviewApp = createApp(CodePreview, {
- fileInfo,
- isEdit,
- callback
- })
- // 注册 Ant Design Vue 组件
- codePreviewApp.use(Antd)
- codePreviewApp.use(snowy)
- codePreviewInstance = codePreviewApp.mount(mountNode)
- return mountNode
- }
- /**
- * 代码预览 Promise 函数
- * @param {Object} obj 包含文件信息和编辑状态的对象
- * @returns {Promise} 抛出确认和取消回调函数
- */
- const showCodePreviewBox = (obj) => {
- // 非首次调用服务时,在 DOM 中移除上个实例
- if (codePreviewInstance !== null && codePreviewApp !== null) {
- codePreviewApp.unmount()
- codePreviewInstance = null
- codePreviewApp = null
- }
- let { fileInfo, isEdit } = obj
- return new Promise((resolve) => {
- const mountNode = initInstanceCodePreview(fileInfo, isEdit, (res) => {
- resolve(res)
- // 服务取消时卸载 DOM
- if (res === 'cancel' && codePreviewInstance !== null) {
- codePreviewApp.unmount()
- document.body.removeChild(mountNode)
- codePreviewInstance = null
- codePreviewApp = null
- }
- })
- document.body.appendChild(mountNode) // 挂载 DOM
- // 使用 setTimeout 确保组件已完全挂载
- setTimeout(() => {
- if (codePreviewInstance) {
- codePreviewInstance.visible = true // 打开代码预览遮罩层
- }
- }, 0)
- })
- }
- export default showCodePreviewBox
|