diff --git a/packages/reactivity/__tests__/effect.spec.ts b/packages/reactivity/__tests__/effect.spec.ts index 369cda983ff..3ce0748b539 100644 --- a/packages/reactivity/__tests__/effect.spec.ts +++ b/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(() => { diff --git a/packages/reactivity/src/effect.ts b/packages/reactivity/src/effect.ts index f4cac6d4edc..03326426d81 100644 --- a/packages/reactivity/src/effect.ts +++ b/packages/reactivity/src/effect.ts @@ -174,8 +174,9 @@ export function trigger( } const effects = new Set() const computedRunners = new Set() - 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) })