feat(reactivity): expose unref and shallowRef

This commit is contained in:
Evan You
2020-02-22 04:39:32 +01:00
parent 0c67201942
commit e9024bf1b7
6 changed files with 59 additions and 11 deletions

View File

@@ -1,4 +1,4 @@
export { ref, isRef, toRefs, Ref, UnwrapRef } from './ref'
export { ref, unref, shallowRef, isRef, toRefs, Ref, UnwrapRef } from './ref'
export {
reactive,
isReactive,

View File

@@ -31,10 +31,22 @@ export function isRef(r: any): r is Ref {
export function ref<T>(value: T): T extends Ref ? T : Ref<T>
export function ref<T = any>(): Ref<T>
export function ref(value?: unknown) {
return createRef(value)
}
export function shallowRef<T>(value: T): T extends Ref ? T : Ref<T>
export function shallowRef<T = any>(): Ref<T>
export function shallowRef(value?: unknown) {
return createRef(value, true)
}
function createRef(value: unknown, shallow = false) {
if (isRef(value)) {
return value
}
value = convert(value)
if (!shallow) {
value = convert(value)
}
const r = {
_isRef: true,
get value() {
@@ -42,7 +54,7 @@ export function ref(value?: unknown) {
return value
},
set value(newVal) {
value = convert(newVal)
value = shallow ? newVal : convert(newVal)
trigger(
r,
TriggerOpTypes.SET,
@@ -54,6 +66,10 @@ export function ref(value?: unknown) {
return r
}
export function unref<T>(ref: T): T extends Ref<infer V> ? V : T {
return isRef(ref) ? (ref.value as any) : ref
}
export function toRefs<T extends object>(
object: T
): { [K in keyof T]: Ref<T[K]> } {