From: Evan You Date: Tue, 20 Aug 2019 13:38:00 +0000 (-0400) Subject: feat: toRefs X-Git-Tag: v3.0.0-alpha.0~914 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=b218678c66dc99ffe0d62e4a9b44834a73213abe;p=thirdparty%2Fvuejs%2Fcore.git feat: toRefs --- diff --git a/packages/reactivity/src/computed.ts b/packages/reactivity/src/computed.ts index 9ffbbf0b52..5cbd1b5a2c 100644 --- a/packages/reactivity/src/computed.ts +++ b/packages/reactivity/src/computed.ts @@ -1,5 +1,5 @@ import { effect, ReactiveEffect, activeReactiveEffectStack } from './effect' -import { UnwrapNestedRefs, knownValues } from './ref' +import { UnwrapNestedRefs, knownRefs } from './ref' export interface ComputedRef { readonly value: UnwrapNestedRefs @@ -42,7 +42,7 @@ export function computed( } } } - knownValues.add(computedValue) + knownRefs.add(computedValue) return computedValue } diff --git a/packages/reactivity/src/index.ts b/packages/reactivity/src/index.ts index f790a70a98..99112a94ca 100644 --- a/packages/reactivity/src/index.ts +++ b/packages/reactivity/src/index.ts @@ -1,4 +1,4 @@ -export { ref, isRef, Ref, UnwrapRef } from './ref' +export { ref, isRef, toRefs, Ref, UnwrapRef } from './ref' export { reactive, isReactive, diff --git a/packages/reactivity/src/ref.ts b/packages/reactivity/src/ref.ts index d2f5a4e455..021fbe09c5 100644 --- a/packages/reactivity/src/ref.ts +++ b/packages/reactivity/src/ref.ts @@ -3,7 +3,7 @@ import { OperationTypes } from './operations' import { isObject } from '@vue/shared' import { reactive } from './reactive' -export const knownValues = new WeakSet() +export const knownRefs = new WeakSet() export interface Ref { value: UnwrapNestedRefs @@ -25,12 +25,38 @@ export function ref(raw: T): Ref { trigger(v, OperationTypes.SET, '') } } - knownValues.add(v) - return v as any + knownRefs.add(v) + return v as Ref } export function isRef(v: any): v is Ref { - return knownValues.has(v) + return knownRefs.has(v) +} + +export function toRefs( + object: T +): { [K in keyof T]: Ref } { + const ret: any = {} + for (const key in object) { + ret[key] = toProxyRef(object, key) + } + return ret +} + +function toProxyRef( + object: T, + key: K +): Ref { + const v = { + get value() { + return object[key] + }, + set value(newVal) { + object[key] = newVal + } + } + knownRefs.add(v) + return v as Ref } type BailTypes = diff --git a/packages/runtime-core/src/apiInject.ts b/packages/runtime-core/src/apiInject.ts index c7f8f327e4..c5f40a7f3e 100644 --- a/packages/runtime-core/src/apiInject.ts +++ b/packages/runtime-core/src/apiInject.ts @@ -1,5 +1,5 @@ import { currentInstance } from './component' -import { immutable } from './apiState' +import { immutable } from './apiReactivity' import { isObject } from '@vue/shared' export interface InjectionKey extends Symbol {} diff --git a/packages/runtime-core/src/apiState.ts b/packages/runtime-core/src/apiReactivity.ts similarity index 99% rename from packages/runtime-core/src/apiState.ts rename to packages/runtime-core/src/apiReactivity.ts index f50e14da21..327cc38527 100644 --- a/packages/runtime-core/src/apiState.ts +++ b/packages/runtime-core/src/apiReactivity.ts @@ -1,6 +1,7 @@ export { ref, isRef, + toRefs, reactive, isReactive, immutable, diff --git a/packages/runtime-core/src/apiWatch.ts b/packages/runtime-core/src/apiWatch.ts index 90ebe02a1e..1053a67f71 100644 --- a/packages/runtime-core/src/apiWatch.ts +++ b/packages/runtime-core/src/apiWatch.ts @@ -7,7 +7,7 @@ import { } from '@vue/reactivity' import { queueJob, queuePostFlushCb } from './scheduler' import { EMPTY_OBJ, isObject, isArray, isFunction } from '@vue/shared' -import { recordEffect } from './apiState' +import { recordEffect } from './apiReactivity' export interface WatchOptions { lazy?: boolean diff --git a/packages/runtime-core/src/index.ts b/packages/runtime-core/src/index.ts index 5fbc426641..ee92001a4a 100644 --- a/packages/runtime-core/src/index.ts +++ b/packages/runtime-core/src/index.ts @@ -19,7 +19,7 @@ export { createRenderer, RendererOptions } from './createRenderer' export { Slot, Slots } from './componentSlots' export { PropType, ComponentPropsOptions } from './componentProps' -export * from './apiState' +export * from './apiReactivity' export * from './apiWatch' export * from './apiLifecycle' export * from './apiInject'