fix(reactivity): fix iOS 12 JSON.stringify error on reactive objects

- Use WeakMap for raw -> reactive/readonly storage. This is slightly
  more expensive than using a field on the taget object but avoids
  polluting the original.

- also fix Collection.forEach callback value

fix #1916
This commit is contained in:
Evan You
2020-08-24 15:26:53 -04:00
parent 410e7abbbb
commit 016ba116a8
4 changed files with 33 additions and 30 deletions

View File

@@ -1,4 +1,12 @@
import { reactive, readonly, toRaw, ReactiveFlags, Target } from './reactive'
import {
reactive,
readonly,
toRaw,
ReactiveFlags,
Target,
readonlyMap,
reactiveMap
} from './reactive'
import { TrackOpTypes, TriggerOpTypes } from './operations'
import { track, trigger, ITERATE_KEY } from './effect'
import {
@@ -48,10 +56,7 @@ function createGetter(isReadonly = false, shallow = false) {
return isReadonly
} else if (
key === ReactiveFlags.RAW &&
receiver ===
(isReadonly
? target[ReactiveFlags.READONLY]
: target[ReactiveFlags.REACTIVE])
receiver === (isReadonly ? readonlyMap : reactiveMap).get(target)
) {
return target
}