fix(reactivity): fix currentScope loss when running detached effect scope (#5575)
This commit is contained in:
		
							parent
							
								
									cee1eafb4d
								
							
						
					
					
						commit
						0a301d4dab
					
				| @ -6,7 +6,8 @@ import { | ||||
|   onScopeDispose, | ||||
|   computed, | ||||
|   ref, | ||||
|   ComputedRef | ||||
|   ComputedRef, | ||||
|   getCurrentScope | ||||
| } from '../src' | ||||
| 
 | ||||
| describe('reactivity/effect/scope', () => { | ||||
| @ -263,4 +264,17 @@ describe('reactivity/effect/scope', () => { | ||||
|     expect(watchSpy).toHaveBeenCalledTimes(1) | ||||
|     expect(watchEffectSpy).toHaveBeenCalledTimes(2) | ||||
|   }) | ||||
| 
 | ||||
|   it('getCurrentScope() stays valid when running a detached nested EffectScope', () => { | ||||
|     const parentScope = new EffectScope() | ||||
| 
 | ||||
|     parentScope.run(() => { | ||||
|       const currentScope = getCurrentScope() | ||||
|       expect(currentScope).toBeDefined() | ||||
|       const detachedScope = new EffectScope(true) | ||||
|       detachedScope.run(() => {}) | ||||
| 
 | ||||
|       expect(getCurrentScope()).toBe(currentScope) | ||||
|     }) | ||||
|   }) | ||||
| }) | ||||
|  | ||||
| @ -8,7 +8,13 @@ export class EffectScope { | ||||
|   effects: ReactiveEffect[] = [] | ||||
|   cleanups: (() => void)[] = [] | ||||
| 
 | ||||
|   /** | ||||
|    * only assinged by undetached scope | ||||
|    */ | ||||
|   parent: EffectScope | undefined | ||||
|   /** | ||||
|    * record undetached scopes | ||||
|    */ | ||||
|   scopes: EffectScope[] | undefined | ||||
|   /** | ||||
|    * track a child scope's index in its parent's scopes array for optimized | ||||
| @ -28,11 +34,12 @@ export class EffectScope { | ||||
| 
 | ||||
|   run<T>(fn: () => T): T | undefined { | ||||
|     if (this.active) { | ||||
|       const currentEffectScope = activeEffectScope | ||||
|       try { | ||||
|         activeEffectScope = this | ||||
|         return fn() | ||||
|       } finally { | ||||
|         activeEffectScope = this.parent | ||||
|         activeEffectScope = currentEffectScope | ||||
|       } | ||||
|     } else if (__DEV__) { | ||||
|       warn(`cannot run an inactive effect scope.`) | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user