From: Evan You Date: Fri, 7 Jun 2019 06:55:38 +0000 (+0800) Subject: wip: restructure api + support watch multiple sources X-Git-Tag: v3.0.0-alpha.0~944 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=07403c9aba57456d9a2fb7c006cacc45499eb55e;p=thirdparty%2Fvuejs%2Fcore.git wip: restructure api + support watch multiple sources --- diff --git a/packages/runtime-core/src/componentLifecycle.ts b/packages/runtime-core/src/apiLifecycle.ts similarity index 100% rename from packages/runtime-core/src/componentLifecycle.ts rename to packages/runtime-core/src/apiLifecycle.ts diff --git a/packages/runtime-core/src/apiState.ts b/packages/runtime-core/src/apiState.ts new file mode 100644 index 0000000000..9b971c2729 --- /dev/null +++ b/packages/runtime-core/src/apiState.ts @@ -0,0 +1,46 @@ +export { + value, + isValue, + observable, + immutable, + isObservable, + isImmutable, + unwrap, + markImmutable, + markNonReactive, + effect, + // types + ReactiveEffect, + ReactiveEffectOptions, + DebuggerEvent, + OperationTypes, + Value, + ComputedValue, + UnwrapValue +} from '@vue/observer' + +import { + computed as _computed, + ComputedValue, + ReactiveEffect +} from '@vue/observer' + +import { currentInstance } from './component' + +// record effects created during a component's setup() so that they can be +// stopped when the component unmounts +export function recordEffect(effect: ReactiveEffect) { + if (currentInstance) { + ;(currentInstance.effects || (currentInstance.effects = [])).push(effect) + } +} + +// a wrapped version of raw computed to tear it down at component unmount +export function computed( + getter: () => T, + setter?: (v: T) => void +): ComputedValue { + const c = _computed(getter, setter) + recordEffect(c.effect) + return c +} diff --git a/packages/runtime-core/src/reactivity.ts b/packages/runtime-core/src/apiWatch.ts similarity index 69% rename from packages/runtime-core/src/reactivity.ts rename to packages/runtime-core/src/apiWatch.ts index 12adfc128e..f8de749fc2 100644 --- a/packages/runtime-core/src/reactivity.ts +++ b/packages/runtime-core/src/apiWatch.ts @@ -1,55 +1,13 @@ -export { - value, - isValue, - observable, - immutable, - isObservable, - isImmutable, - unwrap, - markImmutable, - markNonReactive, - effect, - // types - ReactiveEffect, - ReactiveEffectOptions, - DebuggerEvent, - OperationTypes, - Value, - ComputedValue, - UnwrapValue -} from '@vue/observer' - import { effect, stop, - computed as _computed, isValue, Value, - ComputedValue, - ReactiveEffect, ReactiveEffectOptions } from '@vue/observer' -import { currentInstance } from './component' import { queueJob, queuePostFlushCb } from './scheduler' import { EMPTY_OBJ, isObject, isArray } from '@vue/shared' - -// record effects created during a component's setup() so that they can be -// stopped when the component unmounts -function recordEffect(effect: ReactiveEffect) { - if (currentInstance) { - ;(currentInstance.effects || (currentInstance.effects = [])).push(effect) - } -} - -// a wrapped version of raw computed to tear it down at component unmount -export function computed( - getter: () => T, - setter?: (v: T) => void -): ComputedValue { - const c = _computed(getter, setter) - recordEffect(c.effect) - return c -} +import { recordEffect } from './apiState' export interface WatchOptions { lazy?: boolean @@ -59,10 +17,12 @@ export interface WatchOptions { onTrigger?: ReactiveEffectOptions['onTrigger'] } +type WatcherSource = Value | (() => T) + const invoke = (fn: Function) => fn() export function watch( - source: Value | (() => T), + source: WatcherSource | WatcherSource[], cb?: ( newValue: V, oldValue: V, @@ -73,7 +33,11 @@ export function watch( const scheduler = flush === 'sync' ? invoke : flush === 'pre' ? queueJob : queuePostFlushCb - const baseGetter = isValue(source) ? () => source.value : source + const baseGetter = isArray(source) + ? () => source.map(s => (isValue(s) ? s.value : s())) + : isValue(source) + ? () => source.value + : source const getter = deep ? () => traverse(baseGetter()) : baseGetter let cleanup: any diff --git a/packages/runtime-core/src/index.ts b/packages/runtime-core/src/index.ts index 46d547da01..573259cabc 100644 --- a/packages/runtime-core/src/index.ts +++ b/packages/runtime-core/src/index.ts @@ -15,7 +15,8 @@ export { createRenderer, RendererOptions } from './createRenderer' export { Slot, Slots } from './componentSlots' export { PropType, ComponentPropsOptions } from './componentProps' -export * from './reactivity' -export * from './componentLifecycle' +export * from './apiState' +export * from './apiWatch' +export * from './apiLifecycle' export * from './patchFlags' export * from './typeFlags'