]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(reactivity): track length on for in iteration on Array
authorEvan You <yyx990803@gmail.com>
Mon, 19 Oct 2020 21:37:10 +0000 (17:37 -0400)
committerEvan You <yyx990803@gmail.com>
Mon, 19 Oct 2020 21:37:35 +0000 (17:37 -0400)
fix #2427

packages/reactivity/__tests__/reactiveArray.spec.ts
packages/reactivity/src/baseHandlers.ts

index 170cb1b39c1f5fc5c1fc63599ae77efa6477f147..da3dc1f101ab68e040f719aef0f1b90bd54daac9 100644 (file)
@@ -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(() => {
index 3d5ee55f6216ebc2d3dc824465772fd3fb615fc5..a246b6f31943d18a8d0c3737c04886f5d85e6a98 100644 (file)
@@ -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)
 }