index.ts 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. import modalFrame from "./modalFrame.vue"
  2. import { createApp, DefineComponent, App } from "vue"
  3. import ElementPlus from "element-plus"
  4. import zhCn from "element-plus/es/locale/lang/zh-cn"
  5. export const modalFrameSet = new Set<App<Element>>()
  6. export function closeAllModalFrame() {
  7. modalFrameSet.forEach(modalFrameItem => {
  8. if (modalFrameItem) {
  9. modalFrameSet.delete(modalFrameItem)
  10. modalFrameItem.unmount()
  11. }
  12. })
  13. }
  14. type vmType = InstanceType<typeof modalFrame>
  15. // eslint-disable-next-line @typescript-eslint/ban-types
  16. export interface modalFrameOptType<T extends DefineComponent<{}, {}, any, any, any, any, any, any, any, unknown, any>> {
  17. template: T
  18. className?: string // 传入的class,可以依靠这个class控制内部样式
  19. modalData: ExtractVByK<InstanceType<T>["$props"], "modalData">
  20. width?: string | number //宽度
  21. height?: string | number //高度
  22. onCancel?: (vm: vmType, instance: InstanceType<T>) => any //取消回调 返回vm
  23. onOk?: (vm: vmType, instance: InstanceType<T>) => any //确认回调 返回 vm
  24. onClose?: (vm: vmType, instance: InstanceType<T>) => any //关闭回调 返回 vm
  25. title?: string //弹窗title
  26. btnShow?: [boolean?, boolean?] //是否显示按钮,[true,false],可以控制按钮的显示隐藏
  27. btnTit?: [string?, string?] // 按钮的文字,["确认"]
  28. maskClose?: boolean //点击遮罩关闭
  29. draggable?: boolean //是否可以拖动
  30. }
  31. // eslint-disable-next-line @typescript-eslint/ban-types
  32. const instanceModalFrame = <T extends DefineComponent<{}, {}, any, any, any, any, any, any, any, unknown, any>>(
  33. opt: ExtractVByK<InstanceType<T>["$props"], "modalData"> extends Record<string, any>
  34. ? modalFrameOptType<T>
  35. : Omit<modalFrameOptType<T>, "modalData">
  36. ) => {
  37. const modalFrameApp = createApp(modalFrame, { ...opt })
  38. modalFrameApp.use(ElementPlus, {
  39. locale: zhCn
  40. })
  41. const vmModalFrame = modalFrameApp.mount(document.createElement("div")) as vmType
  42. vmModalFrame.vm = vmModalFrame
  43. vmModalFrame.vmApp = modalFrameApp
  44. modalFrameSet.add(vmModalFrame.vmApp)
  45. document.body.appendChild(vmModalFrame.$el)
  46. vmModalFrame.$nextTick(() => {
  47. vmModalFrame.show = true
  48. })
  49. }
  50. export default instanceModalFrame