From e4db8ebd90256ceef619a098a1ad81b84c0e9c32 Mon Sep 17 00:00:00 2001 From: volare <867484528@qq.com> Date: Tue, 18 Jun 2024 23:10:42 +0800 Subject: [PATCH] fix(reactivity): chained computeds lost reactivity --- .../reactivity/__tests__/computed.spec.ts | 27 +++++++++++++++++++ packages/reactivity/src/effect.ts | 4 ++- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/packages/reactivity/__tests__/computed.spec.ts b/packages/reactivity/__tests__/computed.spec.ts index 0122f4e4391..73a90f61f76 100644 --- a/packages/reactivity/__tests__/computed.spec.ts +++ b/packages/reactivity/__tests__/computed.spec.ts @@ -708,6 +708,33 @@ describe('reactivity/computed', () => { expect(COMPUTED_SIDE_EFFECT_WARN).toHaveBeenWarned() }) + it('should chained computeds keep reactivity when computed effect happens', async () => { + const v = ref('Hello') + const c = computed(() => { + v.value += ' World' + return v.value + }) + const d = computed(() => c.value) + const e = computed(() => d.value) + const Comp = { + setup: () => { + return () => d.value + ' | ' + e.value + }, + } + const root = nodeOps.createElement('div') + + render(h(Comp), root) + await nextTick() + expect(serializeInner(root)).toBe('Hello World | Hello World') + + v.value += ' World' + await nextTick() + expect(serializeInner(root)).toBe( + 'Hello World World World | Hello World World World', + ) + expect(COMPUTED_SIDE_EFFECT_WARN).toHaveBeenWarned() + }) + it('debug: onTrigger (ref)', () => { let events: DebuggerEvent[] = [] const onTrigger = vi.fn((e: DebuggerEvent) => { diff --git a/packages/reactivity/src/effect.ts b/packages/reactivity/src/effect.ts index 727513fc66c..8eb1abdab25 100644 --- a/packages/reactivity/src/effect.ts +++ b/packages/reactivity/src/effect.ts @@ -93,8 +93,10 @@ export class ReactiveEffect { if ( dep.computed.effect._dirtyLevel === DirtyLevels.MaybeDirty_ComputedSideEffect_Origin - ) + ) { + resetTracking() return true + } triggerComputed(dep.computed) if (this._dirtyLevel >= DirtyLevels.Dirty) { break