|
1 | 1 | import { track, trigger } from './effect' |
2 | 2 | import { TrackOpTypes, TriggerOpTypes } from './operations' |
3 | 3 | import { isObject, hasChanged } from '@vue/shared' |
4 | | -import { reactive, isProxy, toRaw } from './reactive' |
| 4 | +import { reactive, isProxy, toRaw, isReactive } from './reactive' |
5 | 5 | import { CollectionTypes } from './collectionHandlers' |
6 | 6 |
|
7 | 7 | declare const RefSymbol: unique symbol |
@@ -71,6 +71,27 @@ export function unref<T>(ref: T): T extends Ref<infer V> ? V : T { |
71 | 71 | return isRef(ref) ? (ref.value as any) : ref |
72 | 72 | } |
73 | 73 |
|
| 74 | +const shallowUnwrapHandlers: ProxyHandler<any> = { |
| 75 | + get: (target, key, receiver) => unref(Reflect.get(target, key, receiver)), |
| 76 | + set: (target, key, value, receiver) => { |
| 77 | + const oldValue = target[key] |
| 78 | + if (isRef(oldValue) && !isRef(value)) { |
| 79 | + oldValue.value = value |
| 80 | + return true |
| 81 | + } else { |
| 82 | + return Reflect.set(target, key, value, receiver) |
| 83 | + } |
| 84 | + } |
| 85 | +} |
| 86 | + |
| 87 | +export function proxyRefs<T extends object>( |
| 88 | + objectWithRefs: T |
| 89 | +): ShallowUnwrapRef<T> { |
| 90 | + return isReactive(objectWithRefs) |
| 91 | + ? objectWithRefs |
| 92 | + : new Proxy(objectWithRefs, shallowUnwrapHandlers) |
| 93 | +} |
| 94 | + |
74 | 95 | export type CustomRefFactory<T> = ( |
75 | 96 | track: () => void, |
76 | 97 | trigger: () => void |
@@ -146,6 +167,10 @@ type BaseTypes = string | number | boolean |
146 | 167 | */ |
147 | 168 | export interface RefUnwrapBailTypes {} |
148 | 169 |
|
| 170 | +export type ShallowUnwrapRef<T> = { |
| 171 | + [K in keyof T]: T[K] extends Ref<infer V> ? V : T[K] |
| 172 | +} |
| 173 | + |
149 | 174 | export type UnwrapRef<T> = T extends Ref<infer V> |
150 | 175 | ? UnwrapRefSimple<V> |
151 | 176 | : UnwrapRefSimple<T> |
|
0 commit comments