From 9821998057efe1ca0d00da2fd0f2c71d0f61e05d Mon Sep 17 00:00:00 2001 From: guaijie <30885718+guaijie@users.noreply.github.com> Date: Fri, 21 Feb 2020 23:08:44 +0800 Subject: [PATCH 1/3] fix(effect): optimize effect trigger --- packages/reactivity/src/effect.ts | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/packages/reactivity/src/effect.ts b/packages/reactivity/src/effect.ts index 03326426d81..acf6c195a4d 100644 --- a/packages/reactivity/src/effect.ts +++ b/packages/reactivity/src/effect.ts @@ -165,7 +165,8 @@ export function trigger( target: object, type: TriggerOpTypes, key?: unknown, - extraInfo?: DebuggerEventExtraInfo + extraInfo?: DebuggerEventExtraInfo, + newValue?: unknown ) { const depsMap = targetMap.get(target) if (depsMap === void 0) { @@ -174,12 +175,19 @@ 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 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) { From 67b724473f958ab895b8c079e54b9767dbbb48eb Mon Sep 17 00:00:00 2001 From: guaijie <30885718+guaijie@users.noreply.github.com> Date: Fri, 21 Feb 2020 23:17:00 +0800 Subject: [PATCH 2/3] Update baseHandlers.ts --- packages/reactivity/src/baseHandlers.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 }) } } } From c1f4077c2623b54fcd9a05dd10a455fb84ffd426 Mon Sep 17 00:00:00 2001 From: guaijie <30885718+guaijie@users.noreply.github.com> Date: Fri, 21 Feb 2020 23:19:04 +0800 Subject: [PATCH 3/3] Update effect.ts --- packages/reactivity/src/effect.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/reactivity/src/effect.ts b/packages/reactivity/src/effect.ts index acf6c195a4d..0cfa2202e4b 100644 --- a/packages/reactivity/src/effect.ts +++ b/packages/reactivity/src/effect.ts @@ -165,8 +165,7 @@ export function trigger( target: object, type: TriggerOpTypes, key?: unknown, - extraInfo?: DebuggerEventExtraInfo, - newValue?: unknown + extraInfo?: DebuggerEventExtraInfo ) { const depsMap = targetMap.get(target) if (depsMap === void 0) { @@ -182,6 +181,7 @@ export function trigger( 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') {