Skip to content

Commit e0df985

Browse files
committed
fix: Revert "fix(reactivity): avoid infinite loop when render access a side effect computed (#11135)"
This reverts commit 8296e19.
1 parent 6c303ea commit e0df985

File tree

4 files changed

+12
-134
lines changed

4 files changed

+12
-134
lines changed

packages/reactivity/__tests__/computed.spec.ts

Lines changed: 6 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -456,78 +456,6 @@ describe('reactivity/computed', () => {
456456
expect(fnSpy).toBeCalledTimes(2)
457457
})
458458

459-
it('should mark dirty as MaybeDirty_ComputedSideEffect_Origin', () => {
460-
const v = ref(1)
461-
const c = computed(() => {
462-
v.value += 1
463-
return v.value
464-
})
465-
466-
c.value
467-
expect(c.effect._dirtyLevel).toBe(
468-
DirtyLevels.MaybeDirty_ComputedSideEffect_Origin,
469-
)
470-
expect(COMPUTED_SIDE_EFFECT_WARN).toHaveBeenWarned()
471-
})
472-
473-
it('should not infinite re-run effect when effect access original side effect computed', async () => {
474-
const spy = vi.fn()
475-
const v = ref(0)
476-
const c = computed(() => {
477-
v.value += 1
478-
return v.value
479-
})
480-
const Comp = {
481-
setup: () => {
482-
return () => {
483-
spy()
484-
return v.value + c.value
485-
}
486-
},
487-
}
488-
const root = nodeOps.createElement('div')
489-
490-
render(h(Comp), root)
491-
expect(spy).toBeCalledTimes(1)
492-
await nextTick()
493-
expect(c.effect._dirtyLevel).toBe(
494-
DirtyLevels.MaybeDirty_ComputedSideEffect_Origin,
495-
)
496-
expect(serializeInner(root)).toBe('2')
497-
expect(COMPUTED_SIDE_EFFECT_WARN).toHaveBeenWarned()
498-
})
499-
500-
it('should not infinite re-run effect when effect access chained side effect computed', async () => {
501-
const spy = vi.fn()
502-
const v = ref(0)
503-
const c1 = computed(() => {
504-
v.value += 1
505-
return v.value
506-
})
507-
const c2 = computed(() => v.value + c1.value)
508-
const Comp = {
509-
setup: () => {
510-
return () => {
511-
spy()
512-
return v.value + c1.value + c2.value
513-
}
514-
},
515-
}
516-
const root = nodeOps.createElement('div')
517-
518-
render(h(Comp), root)
519-
expect(spy).toBeCalledTimes(1)
520-
await nextTick()
521-
expect(c1.effect._dirtyLevel).toBe(
522-
DirtyLevels.MaybeDirty_ComputedSideEffect_Origin,
523-
)
524-
expect(c2.effect._dirtyLevel).toBe(
525-
DirtyLevels.MaybeDirty_ComputedSideEffect,
526-
)
527-
expect(serializeInner(root)).toBe('4')
528-
expect(COMPUTED_SIDE_EFFECT_WARN).toHaveBeenWarned()
529-
})
530-
531459
it('should chained recurse effects clear dirty after trigger', () => {
532460
const v = ref(1)
533461
const c1 = computed(() => v.value)
@@ -554,9 +482,7 @@ describe('reactivity/computed', () => {
554482

555483
c3.value
556484

557-
expect(c1.effect._dirtyLevel).toBe(
558-
DirtyLevels.MaybeDirty_ComputedSideEffect_Origin,
559-
)
485+
expect(c1.effect._dirtyLevel).toBe(DirtyLevels.Dirty)
560486
expect(c2.effect._dirtyLevel).toBe(
561487
DirtyLevels.MaybeDirty_ComputedSideEffect,
562488
)
@@ -576,9 +502,7 @@ describe('reactivity/computed', () => {
576502
})
577503
const c2 = computed(() => v.value + c1.value)
578504
expect(c2.value).toBe('0foo')
579-
expect(c2.effect._dirtyLevel).toBe(
580-
DirtyLevels.MaybeDirty_ComputedSideEffect,
581-
)
505+
expect(c2.effect._dirtyLevel).toBe(DirtyLevels.Dirty)
582506
expect(c2.value).toBe('1foo')
583507
expect(COMPUTED_SIDE_EFFECT_WARN).toHaveBeenWarned()
584508
})
@@ -599,12 +523,8 @@ describe('reactivity/computed', () => {
599523
c2.value
600524
})
601525
expect(fnSpy).toBeCalledTimes(1)
602-
expect(c1.effect._dirtyLevel).toBe(
603-
DirtyLevels.MaybeDirty_ComputedSideEffect_Origin,
604-
)
605-
expect(c2.effect._dirtyLevel).toBe(
606-
DirtyLevels.MaybeDirty_ComputedSideEffect,
607-
)
526+
expect(c1.effect._dirtyLevel).toBe(DirtyLevels.Dirty)
527+
expect(c2.effect._dirtyLevel).toBe(DirtyLevels.Dirty)
608528
v.value = 2
609529
expect(fnSpy).toBeCalledTimes(2)
610530
expect(COMPUTED_SIDE_EFFECT_WARN).toHaveBeenWarned()
@@ -637,9 +557,7 @@ describe('reactivity/computed', () => {
637557
expect(c3.effect._dirtyLevel).toBe(DirtyLevels.MaybeDirty)
638558

639559
c3.value
640-
expect(c1.effect._dirtyLevel).toBe(
641-
DirtyLevels.MaybeDirty_ComputedSideEffect_Origin,
642-
)
560+
expect(c1.effect._dirtyLevel).toBe(DirtyLevels.Dirty)
643561
expect(c2.effect._dirtyLevel).toBe(
644562
DirtyLevels.MaybeDirty_ComputedSideEffect,
645563
)
@@ -693,18 +611,11 @@ describe('reactivity/computed', () => {
693611

694612
render(h(Comp), root)
695613
await nextTick()
696-
expect(c.effect._dirtyLevel).toBe(
697-
DirtyLevels.MaybeDirty_ComputedSideEffect_Origin,
698-
)
699614
expect(serializeInner(root)).toBe('Hello World')
700615

701616
v.value += ' World'
702-
expect(c.effect._dirtyLevel).toBe(DirtyLevels.Dirty)
703617
await nextTick()
704-
expect(c.effect._dirtyLevel).toBe(
705-
DirtyLevels.MaybeDirty_ComputedSideEffect_Origin,
706-
)
707-
expect(serializeInner(root)).toBe('Hello World World World')
618+
expect(serializeInner(root)).toBe('Hello World World World World')
708619
expect(COMPUTED_SIDE_EFFECT_WARN).toHaveBeenWarned()
709620
})
710621

packages/reactivity/src/computed.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -78,10 +78,7 @@ export class ComputedRefImpl<T> {
7878
triggerRefValue(self, DirtyLevels.Dirty)
7979
}
8080
trackRefValue(self)
81-
if (
82-
self.effect._dirtyLevel >=
83-
DirtyLevels.MaybeDirty_ComputedSideEffect_Origin
84-
) {
81+
if (self.effect._dirtyLevel >= DirtyLevels.MaybeDirty_ComputedSideEffect) {
8582
if (__DEV__ && (__TEST__ || this._warnRecursive)) {
8683
warn(COMPUTED_SIDE_EFFECT_WARN, `\n\ngetter: `, this.getter)
8784
}

packages/reactivity/src/constants.ts

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,9 @@ export enum ReactiveFlags {
2323
}
2424

2525
export enum DirtyLevels {
26-
NotDirty,
27-
QueryingDirty,
28-
MaybeDirty_ComputedSideEffect_Origin,
29-
MaybeDirty_ComputedSideEffect,
30-
MaybeDirty,
31-
Dirty,
26+
NotDirty = 0,
27+
QueryingDirty = 1,
28+
MaybeDirty_ComputedSideEffect = 2,
29+
MaybeDirty = 3,
30+
Dirty = 4,
3231
}

packages/reactivity/src/effect.ts

Lines changed: 0 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -76,9 +76,6 @@ export class ReactiveEffect<T = any> {
7676
}
7777

7878
public get dirty() {
79-
// treat original side effect computed as not dirty to avoid infinite loop
80-
if (this._dirtyLevel === DirtyLevels.MaybeDirty_ComputedSideEffect_Origin)
81-
return false
8279
if (
8380
this._dirtyLevel === DirtyLevels.MaybeDirty_ComputedSideEffect ||
8481
this._dirtyLevel === DirtyLevels.MaybeDirty
@@ -88,13 +85,6 @@ export class ReactiveEffect<T = any> {
8885
for (let i = 0; i < this._depsLength; i++) {
8986
const dep = this.deps[i]
9087
if (dep.computed) {
91-
// treat chained side effect computed as dirty to force it re-run
92-
// since we know the original side effect computed is dirty
93-
if (
94-
dep.computed.effect._dirtyLevel ===
95-
DirtyLevels.MaybeDirty_ComputedSideEffect_Origin
96-
)
97-
return true
9888
triggerComputed(dep.computed)
9989
if (this._dirtyLevel >= DirtyLevels.Dirty) {
10090
break
@@ -308,30 +298,11 @@ export function triggerEffects(
308298
for (const effect of dep.keys()) {
309299
// dep.get(effect) is very expensive, we need to calculate it lazily and reuse the result
310300
let tracking: boolean | undefined
311-
312-
if (!dep.computed && effect.computed) {
313-
if (
314-
effect._runnings > 0 &&
315-
(tracking ??= dep.get(effect) === effect._trackId)
316-
) {
317-
effect._dirtyLevel = DirtyLevels.MaybeDirty_ComputedSideEffect_Origin
318-
continue
319-
}
320-
}
321-
322301
if (
323302
effect._dirtyLevel < dirtyLevel &&
324303
(tracking ??= dep.get(effect) === effect._trackId)
325304
) {
326305
effect._shouldSchedule ||= effect._dirtyLevel === DirtyLevels.NotDirty
327-
// always schedule if the computed is original side effect
328-
// since we know it is actually dirty
329-
if (
330-
effect.computed &&
331-
effect._dirtyLevel === DirtyLevels.MaybeDirty_ComputedSideEffect_Origin
332-
) {
333-
effect._shouldSchedule = true
334-
}
335306
effect._dirtyLevel = dirtyLevel
336307
}
337308
if (

0 commit comments

Comments
 (0)