|
|
@@ -1,5 +1,5 @@
|
|
|
import { TrackOpTypes, TriggerOpTypes } from './operations'
|
|
|
-import { EMPTY_OBJ, isArray, isIntegerKey } from '@vue/shared'
|
|
|
+import { EMPTY_OBJ, isArray, isIntegerKey, isMap } from '@vue/shared'
|
|
|
|
|
|
// The main WeakMap that stores {target -> key -> dep} connections.
|
|
|
// Conceptually, it's easier to think of a dependency as a Dep class
|
|
|
@@ -197,19 +197,33 @@ export function trigger(
|
|
|
if (key !== void 0) {
|
|
|
add(depsMap.get(key))
|
|
|
}
|
|
|
+
|
|
|
// also run for iteration key on ADD | DELETE | Map.SET
|
|
|
- const shouldTriggerIteration =
|
|
|
- (type === TriggerOpTypes.ADD &&
|
|
|
- (!isArray(target) || isIntegerKey(key))) ||
|
|
|
- (type === TriggerOpTypes.DELETE && !isArray(target))
|
|
|
- if (
|
|
|
- shouldTriggerIteration ||
|
|
|
- (type === TriggerOpTypes.SET && target instanceof Map)
|
|
|
- ) {
|
|
|
- add(depsMap.get(isArray(target) ? 'length' : ITERATE_KEY))
|
|
|
- }
|
|
|
- if (shouldTriggerIteration && target instanceof Map) {
|
|
|
- add(depsMap.get(MAP_KEY_ITERATE_KEY))
|
|
|
+ switch (type) {
|
|
|
+ case TriggerOpTypes.ADD:
|
|
|
+ if (!isArray(target)) {
|
|
|
+ add(depsMap.get(ITERATE_KEY))
|
|
|
+ if (isMap(target)) {
|
|
|
+ add(depsMap.get(MAP_KEY_ITERATE_KEY))
|
|
|
+ }
|
|
|
+ } else if (isIntegerKey(key)) {
|
|
|
+ // new index added to array -> length changes
|
|
|
+ add(depsMap.get('length'))
|
|
|
+ }
|
|
|
+ break
|
|
|
+ case TriggerOpTypes.DELETE:
|
|
|
+ if (!isArray(target)) {
|
|
|
+ add(depsMap.get(ITERATE_KEY))
|
|
|
+ if (isMap(target)) {
|
|
|
+ add(depsMap.get(MAP_KEY_ITERATE_KEY))
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break
|
|
|
+ case TriggerOpTypes.SET:
|
|
|
+ if (isMap(target)) {
|
|
|
+ add(depsMap.get(ITERATE_KEY))
|
|
|
+ }
|
|
|
+ break
|
|
|
}
|
|
|
}
|
|
|
|