]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix: Revert "fix: Revert "fix(reactivity): self-referencing computed should refresh""
authorEvan You <evan@vuejs.org>
Tue, 10 Sep 2024 07:55:41 +0000 (15:55 +0800)
committerEvan You <evan@vuejs.org>
Tue, 10 Sep 2024 08:01:20 +0000 (16:01 +0800)
This reverts commit 35c760f82f749f7c6e3f9bfead8221ce498e892f.

packages/reactivity/__tests__/computed.spec.ts
packages/reactivity/src/computed.ts
packages/reactivity/src/effect.ts

index 31daef559a8115a043efe3a8316d7f21f8561c63..e0b47cf56ebbd2e804202b1cbfbce71f0f85114f 100644 (file)
@@ -594,7 +594,7 @@ describe('reactivity/computed', () => {
 
     v.value += ' World'
     await nextTick()
-    expect(serializeInner(root)).toBe('Hello World World World')
+    expect(serializeInner(root)).toBe('Hello World World World World')
     // expect(COMPUTED_SIDE_EFFECT_WARN).toHaveBeenWarned()
   })
 
@@ -892,7 +892,7 @@ describe('reactivity/computed', () => {
     v.value += ' World'
     await nextTick()
     expect(serializeInner(root)).toBe(
-      'Hello World World World | Hello World World World',
+      'Hello World World World World | Hello World World World World',
     )
   })
 
@@ -962,6 +962,7 @@ describe('reactivity/computed', () => {
     })
   })
 
+  // #11797
   test('should prevent endless recursion in self-referencing computed getters', async () => {
     const Comp = defineComponent({
       data() {
@@ -998,7 +999,7 @@ describe('reactivity/computed', () => {
     })
     const root = nodeOps.createElement('div')
     render(h(Comp), root)
-    expect(serializeInner(root)).toBe(`<button>Step</button><p></p>`)
+    expect(serializeInner(root)).toBe(`<button>Step</button><p>Step 1</p>`)
     triggerEvent(root.children[1] as TestElement, 'click')
     await nextTick()
     expect(serializeInner(root)).toBe(`<button>Step</button><p>Step 2</p>`)
index aa5d2079061f8d36caed72484ab628bd641c7c44..d2dd67bf97c444da4b7a0e4c9ae57e4fc1ce8f2e 100644 (file)
@@ -111,9 +111,9 @@ export class ComputedRefImpl<T = any> implements Subscriber {
    * @internal
    */
   notify(): void {
+    this.flags |= EffectFlags.DIRTY
     // avoid infinite self recursion
     if (activeSub !== this) {
-      this.flags |= EffectFlags.DIRTY
       this.dep.notify()
     } else if (__DEV__) {
       // TODO warn
index 88493e4e9a9e015fa0994ebd2840f2218774c8b2..678ee1982fe83215ee3bad87b6c0ef2f6021f3e9 100644 (file)
@@ -326,7 +326,7 @@ function isDirty(sub: Subscriber): boolean {
   for (let link = sub.deps; link; link = link.nextDep) {
     if (
       link.dep.version !== link.version ||
-      (link.dep.computed && refreshComputed(link.dep.computed) === false) ||
+      (link.dep.computed && refreshComputed(link.dep.computed)) ||
       link.dep.version !== link.version
     ) {
       return true
@@ -344,10 +344,7 @@ function isDirty(sub: Subscriber): boolean {
  * Returning false indicates the refresh failed
  * @internal
  */
-export function refreshComputed(computed: ComputedRefImpl): false | undefined {
-  if (computed.flags & EffectFlags.RUNNING) {
-    return false
-  }
+export function refreshComputed(computed: ComputedRefImpl): undefined {
   if (
     computed.flags & EffectFlags.TRACKING &&
     !(computed.flags & EffectFlags.DIRTY)