Skip to content

Commit bcdecb7

Browse files
committed
fix(reactivity): re-fix #10114
1 parent 07922da commit bcdecb7

File tree

3 files changed

+40
-10
lines changed

3 files changed

+40
-10
lines changed

packages/reactivity/__tests__/computed.spec.ts

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -454,14 +454,10 @@ describe('reactivity/computed', () => {
454454
expect(fnSpy).toBeCalledTimes(2)
455455
})
456456

457-
it('...', () => {
458-
const fnSpy = vi.fn()
457+
it('should chained recurse effects clear dirty after trigger', () => {
459458
const v = ref(1)
460459
const c1 = computed(() => v.value)
461-
const c2 = computed(() => {
462-
fnSpy()
463-
return c1.value
464-
})
460+
const c2 = computed(() => c1.value)
465461

466462
c1.effect.allowRecurse = true
467463
c2.effect.allowRecurse = true
@@ -471,6 +467,40 @@ describe('reactivity/computed', () => {
471467
expect(c2.effect._dirtyLevel).toBe(DirtyLevels.NotDirty)
472468
})
473469

470+
it('should chained computeds dirtyLevel update with first computed effect', () => {
471+
const v = ref(0)
472+
const c1 = computed(() => {
473+
if (v.value === 0) {
474+
v.value = 1
475+
}
476+
return v.value
477+
})
478+
const c2 = computed(() => c1.value)
479+
const c3 = computed(() => c2.value)
480+
481+
c3.value
482+
483+
expect(c1.effect._dirtyLevel).toBe(DirtyLevels.Dirty)
484+
expect(c2.effect._dirtyLevel).toBe(DirtyLevels.MaybeDirty)
485+
expect(c3.effect._dirtyLevel).toBe(DirtyLevels.MaybeDirty)
486+
487+
v.value = 2
488+
489+
expect(c2.value).toBe(2)
490+
})
491+
492+
it('should work when chained(ref+computed)', () => {
493+
const value = ref(0)
494+
const consumer = computed(() => {
495+
value.value++
496+
return 'foo'
497+
})
498+
const provider = computed(() => value.value + consumer.value)
499+
expect(provider.value).toBe('0foo')
500+
expect(provider.effect._dirtyLevel).toBe(DirtyLevels.Dirty)
501+
expect(provider.value).toBe('1foo')
502+
})
503+
474504
it('should be not dirty after deps mutate (mutate deps in computed)', async () => {
475505
const state = reactive<any>({})
476506
const consumer = computed(() => {

packages/reactivity/src/computed.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,9 @@ export class ComputedRefImpl<T> {
5959
}
6060
}
6161
trackRefValue(self)
62+
if (self.effect._dirtyLevel >= DirtyLevels.MaybeDirty) {
63+
triggerRefValue(self, DirtyLevels.MaybeDirty)
64+
}
6265
return self._value
6366
}
6467

packages/reactivity/src/effect.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -295,10 +295,7 @@ export function triggerEffects(
295295
// when recurse effect is running, dep map could have outdated items
296296
continue
297297
}
298-
if (
299-
effect._dirtyLevel < dirtyLevel &&
300-
!(effect._runnings && !effect.allowRecurse)
301-
) {
298+
if (effect._dirtyLevel < dirtyLevel) {
302299
const lastDirtyLevel = effect._dirtyLevel
303300
effect._dirtyLevel = dirtyLevel
304301
if (lastDirtyLevel === DirtyLevels.NotDirty) {

0 commit comments

Comments
 (0)