From 0e921b9b78e452da78f09f11edb964f5f21fd572 Mon Sep 17 00:00:00 2001 From: guaijie <30885718+guaijie@users.noreply.github.com> Date: Sat, 22 Feb 2020 00:07:08 +0800 Subject: [PATCH 1/5] Update effect.ts --- packages/reactivity/src/effect.ts | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/packages/reactivity/src/effect.ts b/packages/reactivity/src/effect.ts index c0f4707d83d..d4c327efc42 100644 --- a/packages/reactivity/src/effect.ts +++ b/packages/reactivity/src/effect.ts @@ -176,17 +176,19 @@ export function trigger( } const effects = new Set() const computedRunners = new Set() - if ( - type === TriggerOpTypes.CLEAR || - (key === 'length' && - isArray(target) && - (newValue as number) < (oldValue as number)) - ) { + 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 64dc675f6404d6c6882b4da9e22e977e8a32e30f Mon Sep 17 00:00:00 2001 From: Evan You Date: Sat, 22 Feb 2020 05:08:59 +0100 Subject: [PATCH 2/5] Update effect.ts --- packages/reactivity/src/effect.ts | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/packages/reactivity/src/effect.ts b/packages/reactivity/src/effect.ts index d4c327efc42..8f81efd9b90 100644 --- a/packages/reactivity/src/effect.ts +++ b/packages/reactivity/src/effect.ts @@ -177,15 +177,14 @@ export function trigger( const effects = new Set() const computedRunners = new Set() if (type === TriggerOpTypes.CLEAR) { - // collection being cleared or Array length mutation + // collection being cleared // trigger all effects for target - depsMap.forEach((dep, i) => { + depsMap.forEach(dep => { 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') { + depsMap.forEach((dep, key) => { + if (key === 'length' || key > (newValue as number)) { addRunners(effects, computedRunners, dep) } }) From 9f49b1b00d6c8f70af598bfa8f643a5dc44f7e24 Mon Sep 17 00:00:00 2001 From: Evan You Date: Sat, 22 Feb 2020 05:09:54 +0100 Subject: [PATCH 3/5] Update effect.ts --- packages/reactivity/src/effect.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/reactivity/src/effect.ts b/packages/reactivity/src/effect.ts index 8f81efd9b90..010aea0020a 100644 --- a/packages/reactivity/src/effect.ts +++ b/packages/reactivity/src/effect.ts @@ -184,7 +184,7 @@ export function trigger( }) } else if (key === 'length' && isArray(target)) { depsMap.forEach((dep, key) => { - if (key === 'length' || key > (newValue as number)) { + if (key === 'length' || key >= (newValue as number)) { addRunners(effects, computedRunners, dep) } }) From 299a3c2f1cc86ad510a357ce2570fcfad7624e4f Mon Sep 17 00:00:00 2001 From: zhangkuangwen Date: Tue, 25 Feb 2020 11:48:59 +0800 Subject: [PATCH 4/5] fix(launch.json): skipFiles fix(optimize effect trigger): trigger delete hander that does not change the array length --- .vscode/launch.json | 3 ++- packages/reactivity/src/effect.ts | 3 +-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index c4ffd0fc5c3..6a86d1c149e 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -19,7 +19,8 @@ "NODE_ENV": "development" }, "console": "integratedTerminal", - "sourceMaps": true + "sourceMaps": true, + "skipFiles": ["", "node_modules"] } ] } diff --git a/packages/reactivity/src/effect.ts b/packages/reactivity/src/effect.ts index 010aea0020a..96c9a2ecd00 100644 --- a/packages/reactivity/src/effect.ts +++ b/packages/reactivity/src/effect.ts @@ -199,8 +199,7 @@ export function trigger( type === TriggerOpTypes.DELETE || (type === TriggerOpTypes.SET && target instanceof Map) ) { - const iterationKey = isArray(target) ? 'length' : ITERATE_KEY - addRunners(effects, computedRunners, depsMap.get(iterationKey)) + addRunners(effects, computedRunners, depsMap.get(ITERATE_KEY)) } } const run = (effect: ReactiveEffect) => { From e17ac067754c2610b331824fe27d332c01b67ce0 Mon Sep 17 00:00:00 2001 From: zhangkuangwen Date: Tue, 25 Feb 2020 12:14:20 +0800 Subject: [PATCH 5/5] fix(effect): triggering delete hander that does not change the array length --- packages/reactivity/src/effect.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/reactivity/src/effect.ts b/packages/reactivity/src/effect.ts index 96c9a2ecd00..6e1fd27893f 100644 --- a/packages/reactivity/src/effect.ts +++ b/packages/reactivity/src/effect.ts @@ -194,8 +194,10 @@ export function trigger( addRunners(effects, computedRunners, depsMap.get(key)) } // also run for iteration key on ADD | DELETE | Map.SET - if ( - type === TriggerOpTypes.ADD || + if (type === TriggerOpTypes.ADD) { + const iterationKey = isArray(target) ? 'length' : ITERATE_KEY + addRunners(effects, computedRunners, depsMap.get(iterationKey)) + } else if ( type === TriggerOpTypes.DELETE || (type === TriggerOpTypes.SET && target instanceof Map) ) {