From: Evan You Date: Mon, 19 Oct 2020 21:37:10 +0000 (-0400) Subject: fix(reactivity): track length on for in iteration on Array X-Git-Tag: v3.0.2~12 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0e5a3c47a7398dfd0107fccf9b615772dd01aa74;p=thirdparty%2Fvuejs%2Fcore.git fix(reactivity): track length on for in iteration on Array fix #2427 --- diff --git a/packages/reactivity/__tests__/reactiveArray.spec.ts b/packages/reactivity/__tests__/reactiveArray.spec.ts index 170cb1b39c..da3dc1f101 100644 --- a/packages/reactivity/__tests__/reactiveArray.spec.ts +++ b/packages/reactivity/__tests__/reactiveArray.spec.ts @@ -128,6 +128,21 @@ describe('reactivity/reactive/Array', () => { expect(fn).toHaveBeenCalledTimes(1) }) + // #2427 + test('track length on for ... in iteration', () => { + const array = reactive([1]) + let length = '' + effect(() => { + length = '' + for (const key in array) { + length += key + } + }) + expect(length).toBe('0') + array.push(1) + expect(length).toBe('01') + }) + describe('Array methods w/ refs', () => { let original: any[] beforeEach(() => { diff --git a/packages/reactivity/src/baseHandlers.ts b/packages/reactivity/src/baseHandlers.ts index 3d5ee55f62..a246b6f319 100644 --- a/packages/reactivity/src/baseHandlers.ts +++ b/packages/reactivity/src/baseHandlers.ts @@ -179,7 +179,7 @@ function has(target: object, key: string | symbol): boolean { } function ownKeys(target: object): (string | number | symbol)[] { - track(target, TrackOpTypes.ITERATE, ITERATE_KEY) + track(target, TrackOpTypes.ITERATE, isArray(target) ? 'length' : ITERATE_KEY) return Reflect.ownKeys(target) }