fix: export proxyRefs

close #12600
This commit is contained in:
Evan You 2022-07-04 10:56:33 +08:00
parent bcb62d1a00
commit e452e9d436
3 changed files with 39 additions and 21 deletions

View File

@ -12,7 +12,7 @@ import {
} from '../shared/util' } from '../shared/util'
import { currentInstance, setCurrentInstance } from './currentInstance' import { currentInstance, setCurrentInstance } from './currentInstance'
import { shallowReactive } from './reactivity/reactive' import { shallowReactive } from './reactivity/reactive'
import { isRef } from './reactivity/ref' import { proxyWithRefUnwrap } from './reactivity/ref'
/** /**
* @internal * @internal
@ -68,9 +68,11 @@ export function initSetup(vm: Component) {
// exposed for compiled render fn // exposed for compiled render fn
const proxy = (vm._setupProxy = {}) const proxy = (vm._setupProxy = {})
for (const key in setupResult) { for (const key in setupResult) {
if (key !== '__sfc') {
proxyWithRefUnwrap(proxy, setupResult, key) proxyWithRefUnwrap(proxy, setupResult, key)
} }
} }
}
} else if (__DEV__ && setupResult !== undefined) { } else if (__DEV__ && setupResult !== undefined) {
warn( warn(
`setup() should return an object. Received: ${ `setup() should return an object. Received: ${
@ -81,25 +83,6 @@ export function initSetup(vm: Component) {
} }
} }
export function proxyWithRefUnwrap(
target: any,
source: Record<string, any>,
key: string
) {
Object.defineProperty(target, key, {
enumerable: true,
configurable: true,
get: () => {
const raw = source[key]
return isRef(raw) ? raw.value : raw
},
set: newVal => {
const raw = source[key]
isRef(raw) ? (raw.value = newVal) : (source[key] = newVal)
}
})
}
function createSetupContext(vm: Component): SetupContext { function createSetupContext(vm: Component): SetupContext {
let exposeCalled = false let exposeCalled = false
return { return {

View File

@ -7,6 +7,7 @@ export {
toRef, toRef,
toRefs, toRefs,
unref, unref,
proxyRefs,
customRef, customRef,
triggerRef, triggerRef,
Ref, Ref,

View File

@ -93,6 +93,40 @@ export function unref<T>(ref: T | Ref<T>): T {
return isRef(ref) ? (ref.value as any) : ref return isRef(ref) ? (ref.value as any) : ref
} }
export function proxyRefs<T extends object>(
objectWithRefs: T
): ShallowUnwrapRef<T> {
if (isReactive(objectWithRefs)) {
return objectWithRefs as any
}
const proxy = {}
const keys = Object.keys(objectWithRefs)
for (let i = 0; i < keys.length; i++) {
proxyWithRefUnwrap(proxy, objectWithRefs, keys[i])
}
return proxy as any
}
export function proxyWithRefUnwrap(
target: any,
source: Record<string, any>,
key: string
) {
Object.defineProperty(target, key, {
enumerable: true,
configurable: true,
get: () => unref(source[key]),
set: value => {
const oldValue = source[key]
if (isRef(oldValue) && !isRef(value)) {
oldValue.value = value
} else {
source[key] = value
}
}
})
}
export type CustomRefFactory<T> = ( export type CustomRefFactory<T> = (
track: () => void, track: () => void,
trigger: () => void trigger: () => void