|
|
@@ -1,7 +1,7 @@
|
|
|
import { track, trigger } from './effect'
|
|
|
import { TrackOpTypes, TriggerOpTypes } from './operations'
|
|
|
import { isObject, hasChanged } from '@vue/shared'
|
|
|
-import { reactive, isProxy, toRaw } from './reactive'
|
|
|
+import { reactive, isProxy, toRaw, isReactive } from './reactive'
|
|
|
import { CollectionTypes } from './collectionHandlers'
|
|
|
|
|
|
declare const RefSymbol: unique symbol
|
|
|
@@ -71,6 +71,27 @@ export function unref<T>(ref: T): T extends Ref<infer V> ? V : T {
|
|
|
return isRef(ref) ? (ref.value as any) : ref
|
|
|
}
|
|
|
|
|
|
+const shallowUnwrapHandlers: ProxyHandler<any> = {
|
|
|
+ get: (target, key, receiver) => unref(Reflect.get(target, key, receiver)),
|
|
|
+ set: (target, key, value, receiver) => {
|
|
|
+ const oldValue = target[key]
|
|
|
+ if (isRef(oldValue) && !isRef(value)) {
|
|
|
+ oldValue.value = value
|
|
|
+ return true
|
|
|
+ } else {
|
|
|
+ return Reflect.set(target, key, value, receiver)
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+export function proxyRefs<T extends object>(
|
|
|
+ objectWithRefs: T
|
|
|
+): ShallowUnwrapRef<T> {
|
|
|
+ return isReactive(objectWithRefs)
|
|
|
+ ? objectWithRefs
|
|
|
+ : new Proxy(objectWithRefs, shallowUnwrapHandlers)
|
|
|
+}
|
|
|
+
|
|
|
export type CustomRefFactory<T> = (
|
|
|
track: () => void,
|
|
|
trigger: () => void
|
|
|
@@ -146,6 +167,10 @@ type BaseTypes = string | number | boolean
|
|
|
*/
|
|
|
export interface RefUnwrapBailTypes {}
|
|
|
|
|
|
+export type ShallowUnwrapRef<T> = {
|
|
|
+ [K in keyof T]: T[K] extends Ref<infer V> ? V : T[K]
|
|
|
+}
|
|
|
+
|
|
|
export type UnwrapRef<T> = T extends Ref<infer V>
|
|
|
? UnwrapRefSimple<V>
|
|
|
: UnwrapRefSimple<T>
|