]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(reactivity): self-referencing computed should refresh
authorEvan You <evan@vuejs.org>
Thu, 5 Sep 2024 10:58:40 +0000 (18:58 +0800)
committerEvan You <evan@vuejs.org>
Thu, 5 Sep 2024 11:04:17 +0000 (19:04 +0800)
ref: https://github.com/vuejs/core/pull/11797#issuecomment-2330738633

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..51df32e9969ad8e1759608d6fc8a9b3e12b73bfa 100644 (file)
@@ -345,9 +345,6 @@ function isDirty(sub: Subscriber): boolean {
  * @internal
  */
 export function refreshComputed(computed: ComputedRefImpl): false | undefined {
-  if (computed.flags & EffectFlags.RUNNING) {
-    return false
-  }
   if (
     computed.flags & EffectFlags.TRACKING &&
     !(computed.flags & EffectFlags.DIRTY)