index.ts 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. import Vue, { CreateElement } from 'vue'
  2. import { VxeUI, renderEmptyElement } from '@vxe-ui/core'
  3. import type { VxeModalDefines, VxeDrawerDefines, VxeLoadingProps, VxeWatermarkProps } from '../../types'
  4. let dynamicContainerElem: HTMLElement
  5. export const DynamicApp = Vue.extend({
  6. data () {
  7. const modals: {
  8. key: number | string
  9. props: VxeModalDefines.ModalOptions
  10. on: Record<string, any>
  11. }[] = []
  12. const drawers: {
  13. key: number | string
  14. props: VxeDrawerDefines.DrawerOptions
  15. on: Record<string, any>
  16. }[] = []
  17. return {
  18. modals,
  19. drawers,
  20. globalLoading: null as null | VxeLoadingProps,
  21. globalWatermark: null as null | VxeWatermarkProps
  22. }
  23. },
  24. methods: {
  25. renderVN (h: CreateElement) {
  26. const VxeUIModalComponent = VxeUI.getComponent('vxe-modal')
  27. const VxeUIDrawerComponent = VxeUI.getComponent('vxe-drawer')
  28. const VxeUILoadingComponent = VxeUI.getComponent('vxe-loading')
  29. const VxeUIWatermarkComponent = VxeUI.getComponent('vxe-watermark')
  30. const { modals, drawers, globalLoading, globalWatermark } = this
  31. return h('div', {}, [
  32. modals.length
  33. ? h('div', {
  34. key: 1,
  35. class: 'vxe-dynamics--modal'
  36. }, modals.map((item) => h(VxeUIModalComponent, {
  37. key: item.key,
  38. props: item.props,
  39. on: item.on
  40. })))
  41. : renderEmptyElement(this),
  42. drawers.length
  43. ? h('div', {
  44. key: 2,
  45. class: 'vxe-dynamics--drawer'
  46. }, drawers.map((item) => h(VxeUIDrawerComponent, {
  47. key: item.key,
  48. props: item.props,
  49. on: item.on
  50. })))
  51. : renderEmptyElement(this),
  52. globalWatermark
  53. ? h(VxeUIWatermarkComponent, {
  54. key: 'gw',
  55. props: globalWatermark
  56. })
  57. : renderEmptyElement(this),
  58. globalLoading
  59. ? h(VxeUILoadingComponent, {
  60. key: 'gl',
  61. props: globalLoading
  62. })
  63. : renderEmptyElement(this)
  64. ])
  65. }
  66. },
  67. render (this: any, h) {
  68. return this.renderVN(h)
  69. }
  70. })
  71. export const dynamicApp = DynamicApp
  72. export const dynamicStore = new DynamicApp()
  73. export function checkDynamic () {
  74. if (!dynamicContainerElem) {
  75. dynamicContainerElem = document.createElement('div')
  76. dynamicContainerElem.className = 'vxe-dynamics'
  77. document.body.appendChild(dynamicContainerElem)
  78. dynamicStore.$mount(dynamicContainerElem)
  79. }
  80. }