loading.ts 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. import type { App, Directive } from 'vue'
  2. import { createLoading } from '@/components/Loading'
  3. const loadingDirective: Directive = {
  4. mounted(el, binding) {
  5. const tip = el.getAttribute('loading-tip')
  6. const background = el.getAttribute('loading-background')
  7. const size = el.getAttribute('loading-size')
  8. const fullscreen = !!binding.modifiers.fullscreen
  9. const instance = createLoading(
  10. {
  11. tip,
  12. background,
  13. size: size || 'large',
  14. loading: !!binding.value,
  15. absolute: !fullscreen,
  16. },
  17. fullscreen ? document.body : el,
  18. )
  19. el.instance = instance
  20. },
  21. updated(el, binding) {
  22. const instance = el.instance
  23. if (!instance)
  24. return
  25. instance.setTip(el.getAttribute('loading-tip'))
  26. if (binding.oldValue !== binding.value)
  27. instance.setLoading?.(binding.value && !instance.loading)
  28. },
  29. unmounted(el) {
  30. el?.instance?.close()
  31. },
  32. }
  33. export function setupLoadingDirective(app: App<Element>) {
  34. app.directive('loading', loadingDirective)
  35. }
  36. export default loadingDirective