index.ts 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. import { nextTick, unref, watch } from 'vue'
  2. import type { Ref } from 'vue'
  3. export type UseDelayedRenderProps = {
  4. indicator: Ref<boolean>
  5. intermediateIndicator: Ref<boolean>
  6. shouldSetIntermediate?: (step: 'show' | 'hide') => boolean
  7. beforeShow?: () => void
  8. beforeHide?: () => void
  9. afterShow?: () => void
  10. afterHide?: () => void
  11. }
  12. export const useDelayedRender = ({
  13. indicator,
  14. intermediateIndicator,
  15. shouldSetIntermediate = () => true,
  16. beforeShow,
  17. afterShow,
  18. afterHide,
  19. beforeHide,
  20. }: UseDelayedRenderProps) => {
  21. watch(
  22. () => unref(indicator),
  23. (val) => {
  24. if (val) {
  25. beforeShow?.()
  26. nextTick(() => {
  27. if (!unref(indicator)) return
  28. if (shouldSetIntermediate('show')) {
  29. intermediateIndicator.value = true
  30. }
  31. })
  32. } else {
  33. beforeHide?.()
  34. nextTick(() => {
  35. if (unref(indicator)) return
  36. if (shouldSetIntermediate('hide')) {
  37. intermediateIndicator.value = false
  38. }
  39. })
  40. }
  41. }
  42. )
  43. // because we don't always set the value ourselves, so that we
  44. // simply watch the value's state, then invoke the corresponding hook.
  45. watch(
  46. () => intermediateIndicator.value,
  47. (val) => {
  48. if (val) {
  49. afterShow?.()
  50. } else {
  51. afterHide?.()
  52. }
  53. }
  54. )
  55. }