]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
perf(effect): optimize effect trigger for array length mutation (#761)
authorguaijie <30885718+guaijie@users.noreply.github.com>
Sat, 22 Feb 2020 04:17:30 +0000 (12:17 +0800)
committerGitHub <noreply@github.com>
Sat, 22 Feb 2020 04:17:30 +0000 (05:17 +0100)
packages/reactivity/src/effect.ts

index c0f4707d83d8f9aed6df9a707907a7d61b2b6283..010aea0020a528f72be20e95d4cfe8d6607b56e0 100644 (file)
@@ -176,17 +176,18 @@ export function trigger(
   }
   const effects = new Set<ReactiveEffect>()
   const computedRunners = new Set<ReactiveEffect>()
-  if (
-    type === TriggerOpTypes.CLEAR ||
-    (key === 'length' &&
-      isArray(target) &&
-      (newValue as number) < (oldValue as number))
-  ) {
-    // collection being cleared or Array length mutation
+  if (type === TriggerOpTypes.CLEAR) {
+    // collection being cleared
     // trigger all effects for target
     depsMap.forEach(dep => {
       addRunners(effects, computedRunners, dep)
     })
+  } else if (key === 'length' && isArray(target)) {
+    depsMap.forEach((dep, key) => {
+      if (key === 'length' || key >= (newValue as number)) {
+        addRunners(effects, computedRunners, dep)
+      }
+    })
   } else {
     // schedule runs for SET | ADD | DELETE
     if (key !== void 0) {