diff --git a/packages/reactivity/src/baseHandlers.ts b/packages/reactivity/src/baseHandlers.ts index 43b6df903bd..4615aaeab1c 100644 --- a/packages/reactivity/src/baseHandlers.ts +++ b/packages/reactivity/src/baseHandlers.ts @@ -101,9 +101,9 @@ function createSetter(isReadonly = false, shallow = false) { } } else { if (!hadKey) { - trigger(target, TriggerOpTypes.ADD, key) + trigger(target, TriggerOpTypes.ADD, key, { newValue: value }) } else if (hasChanged(value, oldValue)) { - trigger(target, TriggerOpTypes.SET, key) + trigger(target, TriggerOpTypes.SET, key, { newValue: value }) } } } diff --git a/packages/reactivity/src/effect.ts b/packages/reactivity/src/effect.ts index 03326426d81..0cfa2202e4b 100644 --- a/packages/reactivity/src/effect.ts +++ b/packages/reactivity/src/effect.ts @@ -174,12 +174,20 @@ export function trigger( } const effects = new Set() const computedRunners = new Set() - if (type === TriggerOpTypes.CLEAR || (key === 'length' && isArray(target))) { + if (type === TriggerOpTypes.CLEAR) { // collection being cleared or Array length mutation // trigger all effects for target - depsMap.forEach(dep => { + depsMap.forEach((dep, i) => { addRunners(effects, computedRunners, dep) }) + } else if (key === 'length' && isArray(target)) { + const newValue = extraInfo.newValue + const startIndex: number = (newValue as number) || 0 + depsMap.forEach((dep, i) => { + if (i >= startIndex || i === 'length') { + addRunners(effects, computedRunners, dep) + } + }) } else { // schedule runs for SET | ADD | DELETE if (key !== void 0) {