Skip to content

Commit c533d3b

Browse files
committed
fix(reactivity): fix vuejs#10085, vuejs#10090 test
1 parent 5a92035 commit c533d3b

File tree

4 files changed

+35
-28
lines changed

4 files changed

+35
-28
lines changed

packages/reactivity/__tests__/computed.spec.ts

+14-6
Original file line numberDiff line numberDiff line change
@@ -466,11 +466,19 @@ describe('reactivity/computed', () => {
466466
c2.effect.allowRecurse = true
467467
c2.value
468468

469-
expect(DirtyLevels[c1.effect._dirtyLevel]).toBe(
470-
DirtyLevels[DirtyLevels.NotDirty],
471-
)
472-
expect(DirtyLevels[c2.effect._dirtyLevel]).toBe(
473-
DirtyLevels[DirtyLevels.NotDirty],
474-
)
469+
expect(c1.effect._dirtyLevel).toBe(DirtyLevels.NotDirty)
470+
expect(c2.effect._dirtyLevel).toBe(DirtyLevels.NotDirty)
471+
})
472+
473+
it('should work when chained(ref+computed)', () => {
474+
const value = ref(0)
475+
const consumer = computed(() => {
476+
value.value++
477+
return 'foo'
478+
})
479+
const provider = computed(() => value.value + consumer.value)
480+
expect(provider.value).toBe('0foo')
481+
expect(provider.effect._dirtyLevel).toBe(DirtyLevels.Dirty)
482+
expect(provider.value).toBe('1foo')
475483
})
476484
})

packages/reactivity/src/computed.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ export class ComputedRefImpl<T> {
4343
) {
4444
this.effect = new ReactiveEffect(
4545
() => getter(this._value),
46-
() => triggerRefValue(this, DirtyLevels.ComputedValueMaybeDirty),
46+
() => triggerRefValue(this, DirtyLevels.MaybeDirty),
4747
)
4848
this.effect.computed = this
4949
this.effect.active = this._cacheable = !isSSR
@@ -55,7 +55,7 @@ export class ComputedRefImpl<T> {
5555
const self = toRaw(this)
5656
if (!self._cacheable || self.effect.dirty) {
5757
if (hasChanged(self._value, (self._value = self.effect.run()!))) {
58-
triggerRefValue(self, DirtyLevels.ComputedValueDirty)
58+
triggerRefValue(self, DirtyLevels.Dirty)
5959
}
6060
}
6161
trackRefValue(self)

packages/reactivity/src/constants.ts

+2-3
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ export enum ReactiveFlags {
2424

2525
export enum DirtyLevels {
2626
NotDirty = 0,
27-
ComputedValueMaybeDirty = 1,
28-
ComputedValueDirty = 2,
29-
Dirty = 3,
27+
MaybeDirty = 1,
28+
Dirty = 2,
3029
}

packages/reactivity/src/effect.ts

+17-17
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ export class ReactiveEffect<T = any> {
6060
/**
6161
* @internal
6262
*/
63-
_queryings = 0
63+
_shouldSchedule = false
6464
/**
6565
* @internal
6666
*/
@@ -76,22 +76,22 @@ export class ReactiveEffect<T = any> {
7676
}
7777

7878
public get dirty() {
79-
if (this._dirtyLevel === DirtyLevels.ComputedValueMaybeDirty) {
80-
this._dirtyLevel = DirtyLevels.NotDirty
81-
this._queryings++
79+
if (this._dirtyLevel === DirtyLevels.MaybeDirty) {
8280
pauseTracking()
8381
for (const dep of this.deps) {
8482
if (dep.computed) {
8583
triggerComputed(dep.computed)
86-
if (this._dirtyLevel >= DirtyLevels.ComputedValueDirty) {
84+
if (this._dirtyLevel >= DirtyLevels.Dirty) {
8785
break
8886
}
8987
}
9088
}
89+
if (this._dirtyLevel < DirtyLevels.Dirty) {
90+
this._dirtyLevel = DirtyLevels.NotDirty
91+
}
9192
resetTracking()
92-
this._queryings--
9393
}
94-
return this._dirtyLevel >= DirtyLevels.ComputedValueDirty
94+
return this._dirtyLevel >= DirtyLevels.Dirty
9595
}
9696

9797
public set dirty(v) {
@@ -290,25 +290,25 @@ export function triggerEffects(
290290
) {
291291
pauseScheduling()
292292
for (const effect of dep.keys()) {
293-
if (!effect.allowRecurse && effect._runnings) {
294-
continue
295-
}
296293
if (effect._dirtyLevel < dirtyLevel) {
297294
const lastDirtyLevel = effect._dirtyLevel
298295
effect._dirtyLevel = dirtyLevel
299-
if (
300-
lastDirtyLevel === DirtyLevels.NotDirty &&
301-
(!effect._queryings || dirtyLevel !== DirtyLevels.ComputedValueDirty)
302-
) {
296+
if (lastDirtyLevel === DirtyLevels.NotDirty) {
297+
effect._shouldSchedule = true
303298
if (__DEV__) {
304299
effect.onTrigger?.(extend({ effect }, debuggerEventExtraInfo))
305300
}
306301
effect.trigger()
307-
if (effect.scheduler) {
308-
queueEffectSchedulers.push(effect.scheduler)
309-
}
310302
}
311303
}
304+
if (
305+
effect.scheduler &&
306+
effect._shouldSchedule &&
307+
(!effect._runnings || effect.allowRecurse)
308+
) {
309+
effect._shouldSchedule = false
310+
queueEffectSchedulers.push(effect.scheduler)
311+
}
312312
}
313313
resetScheduling()
314314
}

0 commit comments

Comments
 (0)