expect(getCurrentScope()).toBe(currentScope)
})
})
+
+ it('calling .off() of a detached scope inside an active scope should not break currentScope', () => {
+ const parentScope = new EffectScope()
+
+ parentScope.run(() => {
+ const childScope = new EffectScope(true)
+ childScope.on()
+ childScope.off()
+ expect(getCurrentScope()).toBe(parentScope)
+ })
+ })
})
*/
private index: number | undefined
- constructor(detached = false) {
+ constructor(public detached = false) {
+ this.parent = activeEffectScope
if (!detached && activeEffectScope) {
- this.parent = activeEffectScope
this.index =
(activeEffectScope.scopes || (activeEffectScope.scopes = [])).push(
this
}
}
// nested scope, dereference from parent to avoid memory leaks
- if (this.parent && !fromParent) {
+ if (!this.detached && this.parent && !fromParent) {
// optimized O(1) removal
const last = this.parent.scopes!.pop()
if (last && last !== this) {
last.index = this.index!
}
}
+ this.parent = undefined
this.active = false
}
}