|
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