]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(reactivity): should trigger all effects when array length is mutated (#754)
authorguaijie <30885718+guaijie@users.noreply.github.com>
Fri, 21 Feb 2020 10:38:07 +0000 (18:38 +0800)
committerGitHub <noreply@github.com>
Fri, 21 Feb 2020 10:38:07 +0000 (11:38 +0100)
packages/reactivity/__tests__/effect.spec.ts
packages/reactivity/src/effect.ts

index 369cda983fff40bd7c9f8d037dc225da3835bb82..3ce0748b5395e07abfd58df879e70b4652b3048b 100644 (file)
@@ -737,6 +737,30 @@ describe('reactivity/effect', () => {
     expect(fnSpy).toHaveBeenCalledTimes(1)
   })
 
+  it('should trigger all effects when array lenght is set 0', () => {
+    const observed: any = reactive([1])
+    let dummy, record
+    effect(() => {
+      dummy = observed.length
+    })
+    effect(() => {
+      record = observed[0]
+    })
+    expect(dummy).toBe(1)
+    expect(record).toBe(1)
+
+    observed[1] = 2
+    expect(observed[1]).toBe(2)
+
+    observed.unshift(3)
+    expect(dummy).toBe(3)
+    expect(record).toBe(3)
+
+    observed.length = 0
+    expect(dummy).toBe(0)
+    expect(record).toBeUndefined()
+  })
+
   it('should handle self dependency mutations', () => {
     const count = ref(0)
     effect(() => {
index f4cac6d4edc3910b922edafb9523434abdbd488b..03326426d8148d0198667d834714ec71d1bf5dc1 100644 (file)
@@ -174,8 +174,9 @@ export function trigger(
   }
   const effects = new Set<ReactiveEffect>()
   const computedRunners = new Set<ReactiveEffect>()
-  if (type === TriggerOpTypes.CLEAR) {
-    // collection being cleared, trigger all effects for target
+  if (type === TriggerOpTypes.CLEAR || (key === 'length' && isArray(target))) {
+    // collection being cleared or Array length mutation
+    // trigger all effects for target
     depsMap.forEach(dep => {
       addRunners(effects, computedRunners, dep)
     })