refactor(reactivity): move array ref handling into getter

This commit is contained in:
Evan You 2020-04-14 22:18:58 -04:00
parent 486dc188fe
commit 09b44e07cb
2 changed files with 20 additions and 16 deletions

View File

@ -36,7 +36,8 @@ const arrayInstrumentations: Record<string, Function> = {}
function createGetter(isReadonly = false, shallow = false) {
return function get(target: object, key: string | symbol, receiver: object) {
if (isArray(target) && hasOwn(arrayInstrumentations, key)) {
const targetIsArray = isArray(target)
if (targetIsArray && hasOwn(arrayInstrumentations, key)) {
return Reflect.get(arrayInstrumentations, key, receiver)
}
const res = Reflect.get(target, key, receiver)
@ -48,10 +49,15 @@ function createGetter(isReadonly = false, shallow = false) {
// TODO strict mode that returns a shallow-readonly version of the value
return res
}
if (isRef(res)) {
if (targetIsArray) {
track(target, TrackOpTypes.GET, key)
return res
} else {
// ref unwrapping, only for Objects, not for Arrays.
if (isRef(res) && !isArray(target)) {
return res.value
}
} else {
track(target, TrackOpTypes.GET, key)
return isObject(res)
? isReadonly
@ -62,6 +68,7 @@ function createGetter(isReadonly = false, shallow = false) {
: res
}
}
}
const set = /*#__PURE__*/ createSetter()
const shallowReactiveSet = /*#__PURE__*/ createSetter(false, true)

View File

@ -9,7 +9,7 @@ import {
mutableCollectionHandlers,
readonlyCollectionHandlers
} from './collectionHandlers'
import { UnwrapRef, Ref, isRef } from './ref'
import { UnwrapRef, Ref } from './ref'
import { makeMap } from '@vue/shared'
// WeakMaps that store {raw <-> observed} pairs.
@ -46,9 +46,6 @@ export function reactive(target: object) {
if (readonlyToRaw.has(target)) {
return target
}
if (isRef(target)) {
return target
}
return createReactiveObject(
target,
rawToReactive,