apiWatch.spec.ts 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import type { Ref } from '@vue/reactivity'
  2. import {
  3. EffectScope,
  4. nextTick,
  5. onWatcherCleanup,
  6. ref,
  7. watchEffect,
  8. watchSyncEffect,
  9. } from '../src'
  10. describe('watchEffect and onWatcherCleanup', () => {
  11. test('basic', async () => {
  12. let dummy = 0
  13. let source: Ref<number>
  14. const scope = new EffectScope()
  15. scope.run(() => {
  16. source = ref(0)
  17. watchEffect(onCleanup => {
  18. source.value
  19. onCleanup(() => (dummy += 2))
  20. onWatcherCleanup(() => (dummy += 3))
  21. onWatcherCleanup(() => (dummy += 5))
  22. })
  23. })
  24. await nextTick()
  25. expect(dummy).toBe(0)
  26. scope.run(() => {
  27. source.value++
  28. })
  29. await nextTick()
  30. expect(dummy).toBe(10)
  31. scope.run(() => {
  32. source.value++
  33. })
  34. await nextTick()
  35. expect(dummy).toBe(20)
  36. scope.stop()
  37. await nextTick()
  38. expect(dummy).toBe(30)
  39. })
  40. test('nested call to watchEffect', async () => {
  41. let dummy = 0
  42. let source: Ref<number>
  43. let double: Ref<number>
  44. const scope = new EffectScope()
  45. scope.run(() => {
  46. source = ref(0)
  47. double = ref(0)
  48. watchEffect(() => {
  49. double.value = source.value * 2
  50. onWatcherCleanup(() => (dummy += 2))
  51. })
  52. watchSyncEffect(() => {
  53. double.value
  54. onWatcherCleanup(() => (dummy += 3))
  55. })
  56. })
  57. await nextTick()
  58. expect(dummy).toBe(0)
  59. scope.run(() => source.value++)
  60. await nextTick()
  61. expect(dummy).toBe(5)
  62. scope.run(() => source.value++)
  63. await nextTick()
  64. expect(dummy).toBe(10)
  65. scope.stop()
  66. await nextTick()
  67. expect(dummy).toBe(15)
  68. })
  69. })