فهرست منبع

fix: Revert "fix(reactivity): self-referencing computed should refresh"

This reverts commit e84c4a608e9dc96fb2a4a29d538bcc64f26103a2.
Evan You 1 سال پیش
والد
کامیت
35c760f82f
3فایلهای تغییر یافته به همراه7 افزوده شده و 5 حذف شده
  1. 3 4
      packages/reactivity/__tests__/computed.spec.ts
  2. 1 1
      packages/reactivity/src/computed.ts
  3. 3 0
      packages/reactivity/src/effect.ts

+ 3 - 4
packages/reactivity/__tests__/computed.spec.ts

@@ -594,7 +594,7 @@ describe('reactivity/computed', () => {
 
     v.value += ' World'
     await nextTick()
-    expect(serializeInner(root)).toBe('Hello World World World World')
+    expect(serializeInner(root)).toBe('Hello 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 World | Hello World World World World',
+      'Hello World World World | Hello World World World',
     )
   })
 
@@ -962,7 +962,6 @@ describe('reactivity/computed', () => {
     })
   })
 
-  // #11797
   test('should prevent endless recursion in self-referencing computed getters', async () => {
     const Comp = defineComponent({
       data() {
@@ -999,7 +998,7 @@ describe('reactivity/computed', () => {
     })
     const root = nodeOps.createElement('div')
     render(h(Comp), root)
-    expect(serializeInner(root)).toBe(`<button>Step</button><p>Step 1</p>`)
+    expect(serializeInner(root)).toBe(`<button>Step</button><p></p>`)
     triggerEvent(root.children[1] as TestElement, 'click')
     await nextTick()
     expect(serializeInner(root)).toBe(`<button>Step</button><p>Step 2</p>`)

+ 1 - 1
packages/reactivity/src/computed.ts

@@ -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

+ 3 - 0
packages/reactivity/src/effect.ts

@@ -345,6 +345,9 @@ 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)