perf(reactivity): only trigger all effects on Array length mutation if new length is shorter than old length

This commit is contained in:
Evan You
2020-02-21 15:05:16 +01:00
parent 9882788cb3
commit 33622d6360
3 changed files with 34 additions and 55 deletions

View File

@@ -91,20 +91,10 @@ function createSetter(isReadonly = false, shallow = false) {
const result = Reflect.set(target, key, value, receiver)
// don't trigger if target is something up in the prototype chain of original
if (target === toRaw(receiver)) {
/* istanbul ignore else */
if (__DEV__) {
const extraInfo = { oldValue, newValue: value }
if (!hadKey) {
trigger(target, TriggerOpTypes.ADD, key, extraInfo)
} else if (hasChanged(value, oldValue)) {
trigger(target, TriggerOpTypes.SET, key, extraInfo)
}
} else {
if (!hadKey) {
trigger(target, TriggerOpTypes.ADD, key)
} else if (hasChanged(value, oldValue)) {
trigger(target, TriggerOpTypes.SET, key)
}
if (!hadKey) {
trigger(target, TriggerOpTypes.ADD, key, value)
} else if (hasChanged(value, oldValue)) {
trigger(target, TriggerOpTypes.SET, key, value, oldValue)
}
}
return result
@@ -116,12 +106,7 @@ function deleteProperty(target: object, key: string | symbol): boolean {
const oldValue = (target as any)[key]
const result = Reflect.deleteProperty(target, key)
if (result && hadKey) {
/* istanbul ignore else */
if (__DEV__) {
trigger(target, TriggerOpTypes.DELETE, key, { oldValue })
} else {
trigger(target, TriggerOpTypes.DELETE, key)
}
trigger(target, TriggerOpTypes.DELETE, key, undefined, oldValue)
}
return result
}