diff --git a/packages/reactivity/__tests__/effectScope.spec.ts b/packages/reactivity/__tests__/effectScope.spec.ts index 28579fef028..a670c1ebc07 100644 --- a/packages/reactivity/__tests__/effectScope.spec.ts +++ b/packages/reactivity/__tests__/effectScope.spec.ts @@ -26,6 +26,14 @@ describe('reactivity/effect/scope', () => { expect(new EffectScope().run(() => 1)).toBe(1) }) + it('should work w/ active property', () => { + const scope = new EffectScope() + scope.run(() => 1) + expect(scope.active).toBe(true) + scope.stop() + expect(scope.active).toBe(false) + }) + it('should collect the effects', () => { const scope = new EffectScope() scope.run(() => { diff --git a/packages/reactivity/src/effectScope.ts b/packages/reactivity/src/effectScope.ts index 557a1379492..c644d03fae6 100644 --- a/packages/reactivity/src/effectScope.ts +++ b/packages/reactivity/src/effectScope.ts @@ -7,7 +7,7 @@ export class EffectScope { /** * @internal */ - active = true + private _active = true /** * @internal */ @@ -44,8 +44,12 @@ export class EffectScope { } } + get active() { + return this._active + } + run(fn: () => T): T | undefined { - if (this.active) { + if (this._active) { const currentEffectScope = activeEffectScope try { activeEffectScope = this @@ -75,7 +79,7 @@ export class EffectScope { } stop(fromParent?: boolean) { - if (this.active) { + if (this._active) { let i, l for (i = 0, l = this.effects.length; i < l; i++) { this.effects[i].stop() @@ -98,7 +102,7 @@ export class EffectScope { } } this.parent = undefined - this.active = false + this._active = false } } } diff --git a/test-dts/reactivity.test-d.ts b/test-dts/reactivity.test-d.ts index 8722441ec14..337f05e147e 100644 --- a/test-dts/reactivity.test-d.ts +++ b/test-dts/reactivity.test-d.ts @@ -1,73 +1,73 @@ -import { - ref, - readonly, - shallowReadonly, - describe, - expectError, - expectType, - Ref, - reactive, - markRaw -} from './index' - -describe('should support DeepReadonly', () => { - const r = readonly({ obj: { k: 'v' } }) - // @ts-expect-error - expectError((r.obj = {})) - // @ts-expect-error - expectError((r.obj.k = 'x')) -}) - -// #4180 -describe('readonly ref', () => { - const r = readonly(ref({ count: 1 })) - expectType(r) -}) - -describe('should support markRaw', () => { - class Test { - item = {} as Ref - } - const test = new Test() - const plain = { - ref: ref(1) - } - - const r = reactive({ - class: { - raw: markRaw(test), - reactive: test - }, - plain: { - raw: markRaw(plain), - reactive: plain - } - }) - - expectType>(r.class.raw) - // @ts-expect-error it should unwrap - expectType>(r.class.reactive) - - expectType>(r.plain.raw.ref) - // @ts-expect-error it should unwrap - expectType>(r.plain.reactive.ref) -}) - -describe('shallowReadonly ref unwrap', () => { - const r = shallowReadonly({ count: { n: ref(1) } }) - // @ts-expect-error - r.count = 2 - expectType(r.count.n) - r.count.n.value = 123 -}) - -// #3819 -describe('should unwrap tuple correctly', () => { - const readonlyTuple = [ref(0)] as const - const reactiveReadonlyTuple = reactive(readonlyTuple) - expectType>(reactiveReadonlyTuple[0]) - - const tuple: [Ref] = [ref(0)] - const reactiveTuple = reactive(tuple) - expectType>(reactiveTuple[0]) -}) +import { + ref, + readonly, + shallowReadonly, + describe, + expectError, + expectType, + Ref, + reactive, + markRaw +} from './index' + +describe('should support DeepReadonly', () => { + const r = readonly({ obj: { k: 'v' } }) + // @ts-expect-error + expectError((r.obj = {})) + // @ts-expect-error + expectError((r.obj.k = 'x')) +}) + +// #4180 +describe('readonly ref', () => { + const r = readonly(ref({ count: 1 })) + expectType(r) +}) + +describe('should support markRaw', () => { + class Test { + item = {} as Ref + } + const test = new Test() + const plain = { + ref: ref(1) + } + + const r = reactive({ + class: { + raw: markRaw(test), + reactive: test + }, + plain: { + raw: markRaw(plain), + reactive: plain + } + }) + + expectType>(r.class.raw) + // @ts-expect-error it should unwrap + expectType>(r.class.reactive) + + expectType>(r.plain.raw.ref) + // @ts-expect-error it should unwrap + expectType>(r.plain.reactive.ref) +}) + +describe('shallowReadonly ref unwrap', () => { + const r = shallowReadonly({ count: { n: ref(1) } }) + // @ts-expect-error + r.count = 2 + expectType(r.count.n) + r.count.n.value = 123 +}) + +// #3819 +describe('should unwrap tuple correctly', () => { + const readonlyTuple = [ref(0)] as const + const reactiveReadonlyTuple = reactive(readonlyTuple) + expectType>(reactiveReadonlyTuple[0]) + + const tuple: [Ref] = [ref(0)] + const reactiveTuple = reactive(tuple) + expectType>(reactiveTuple[0]) +})