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
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
*/
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>
import { VNode, VNodeChild, isVNode } from './vnode'
import {
- reactive,
ReactiveEffect,
pauseTracking,
resetTracking,
- shallowReadonly
+ shallowReadonly,
+ proxyRefs
} from '@vue/reactivity'
import {
CreateComponentPublicInstance,
}
// setup returned bindings.
// assuming a render function compiled from template is present.
- instance.setupState = reactive(setupResult)
+ instance.setupState = proxyRefs(setupResult)
if (__DEV__) {
exposeSetupStateOnRenderContext(instance)
}