Browse Source

fix(reactivity): should not trigger length dependency on Array delete

close #774
Evan You 6 years ago
parent
commit
a3066581f3

+ 11 - 0
packages/reactivity/__tests__/reactiveArray.spec.ts

@@ -88,6 +88,17 @@ describe('reactivity/reactive/Array', () => {
     expect(index).toBe(1)
   })
 
+  test('delete on Array should not trigger length dependency', () => {
+    const arr = reactive([1, 2, 3])
+    const fn = jest.fn()
+    effect(() => {
+      fn(arr.length)
+    })
+    expect(fn).toHaveBeenCalledTimes(1)
+    delete arr[1]
+    expect(fn).toHaveBeenCalledTimes(1)
+  })
+
   describe('Array methods w/ refs', () => {
     let original: any[]
     beforeEach(() => {

+ 1 - 1
packages/reactivity/src/effect.ts

@@ -196,7 +196,7 @@ export function trigger(
     // also run for iteration key on ADD | DELETE | Map.SET
     if (
       type === TriggerOpTypes.ADD ||
-      type === TriggerOpTypes.DELETE ||
+      (type === TriggerOpTypes.DELETE && !isArray(target)) ||
       (type === TriggerOpTypes.SET && target instanceof Map)
     ) {
       const iterationKey = isArray(target) ? 'length' : ITERATE_KEY