Ver Fonte

fix(reactivity): should trigger all effects when array length is mutated (#754)

guaijie há 6 anos atrás
pai
commit
5fac65589b

+ 24 - 0
packages/reactivity/__tests__/effect.spec.ts

@@ -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(() => {

+ 3 - 2
packages/reactivity/src/effect.ts

@@ -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)
     })