diff --git a/packages/reactivity/__tests__/deferredComputed.spec.ts b/packages/reactivity/__tests__/deferredComputed.spec.ts index 3940280176a..da1bd7b7e3a 100644 --- a/packages/reactivity/__tests__/deferredComputed.spec.ts +++ b/packages/reactivity/__tests__/deferredComputed.spec.ts @@ -166,6 +166,32 @@ describe('deferred computed', () => { expect(effectSpy).toHaveBeenCalledTimes(2) }) + test('sync access to computed property should get the latest value', () => { + const bSpy = jest.fn() + const c1Spy = jest.fn() + const c2Spy = jest.fn() + + const a = ref(0) + const b = deferredComputed(() => { + bSpy() + return a.value + }) + const c1 = deferredComputed(() => { + c1Spy() + return b.value + }) + const c2 = computed(() => { + c2Spy() + return b.value + }) + // emit computed getter + c1.value;c2.value; + a.value = 2 + // sync access + expect(c1.value).toEqual(2) + expect(c2.value).toEqual(2) + }) + test('should not compute if deactivated before scheduler is called', async () => { const c1Spy = jest.fn() const src = ref(0) diff --git a/packages/reactivity/src/computed.ts b/packages/reactivity/src/computed.ts index e9f36ecd22f..38fe213f039 100644 --- a/packages/reactivity/src/computed.ts +++ b/packages/reactivity/src/computed.ts @@ -41,12 +41,19 @@ export class ComputedRefImpl { isReadonly: boolean, isSSR: boolean ) { - this.effect = new ReactiveEffect(getter, () => { - if (!this._dirty) { - this._dirty = true - triggerRefValue(this) + this.effect = new ReactiveEffect( + getter, + (deferredComputedTrigger?: boolean) => { + if (deferredComputedTrigger) { + this._dirty = true + }else{ + if (!this._dirty) { + this._dirty = true + } + triggerRefValue(this) + } } - }) + ) this.effect.computed = this this.effect.active = this._cacheable = !isSSR this[ReactiveFlags.IS_READONLY] = isReadonly diff --git a/packages/reactivity/src/deferredComputed.ts b/packages/reactivity/src/deferredComputed.ts index a23122046a4..fd6a741c4aa 100644 --- a/packages/reactivity/src/deferredComputed.ts +++ b/packages/reactivity/src/deferredComputed.ts @@ -58,7 +58,7 @@ class DeferredComputedRefImpl { // value invalidation in case of sync access; normal effects are // deferred to be triggered in scheduler. for (const e of this.dep) { - if (e.computed instanceof DeferredComputedRefImpl) { + if (e.computed) { e.scheduler!(true /* computedTrigger */) } }