|
|
@@ -11,16 +11,17 @@ const builtInSymbols = new Set(
|
|
|
.filter(isSymbol)
|
|
|
)
|
|
|
|
|
|
-function createGetter(isReadonly: boolean) {
|
|
|
+function createGetter(isReadonly: boolean, unwrap: boolean = true) {
|
|
|
return function get(target: object, key: string | symbol, receiver: object) {
|
|
|
- const res = Reflect.get(target, key, receiver)
|
|
|
+ let res = Reflect.get(target, key, receiver)
|
|
|
if (isSymbol(key) && builtInSymbols.has(key)) {
|
|
|
return res
|
|
|
}
|
|
|
- if (isRef(res)) {
|
|
|
- return res.value
|
|
|
+ if (unwrap && isRef(res)) {
|
|
|
+ res = res.value
|
|
|
+ } else {
|
|
|
+ track(target, OperationTypes.GET, key)
|
|
|
}
|
|
|
- track(target, OperationTypes.GET, key)
|
|
|
return isObject(res)
|
|
|
? isReadonly
|
|
|
? // need to lazy access readonly and reactive here to avoid
|
|
|
@@ -141,3 +142,11 @@ export const readonlyHandlers: ProxyHandler<object> = {
|
|
|
has,
|
|
|
ownKeys
|
|
|
}
|
|
|
+
|
|
|
+// props handlers are special in the sense that it should not unwrap top-level
|
|
|
+// refs (in order to allow refs to be explicitly passed down), but should
|
|
|
+// retain the reactivity of the normal readonly object.
|
|
|
+export const readonlyPropsHandlers: ProxyHandler<object> = {
|
|
|
+ ...readonlyHandlers,
|
|
|
+ get: createGetter(true, false)
|
|
|
+}
|