index.ts 1.9 KB

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