]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
wip: restructure api + support watch multiple sources
authorEvan You <yyx990803@gmail.com>
Fri, 7 Jun 2019 06:55:38 +0000 (14:55 +0800)
committerEvan You <yyx990803@gmail.com>
Fri, 7 Jun 2019 06:55:38 +0000 (14:55 +0800)
packages/runtime-core/src/apiLifecycle.ts [moved from packages/runtime-core/src/componentLifecycle.ts with 100% similarity]
packages/runtime-core/src/apiState.ts [new file with mode: 0644]
packages/runtime-core/src/apiWatch.ts [moved from packages/runtime-core/src/reactivity.ts with 69% similarity]
packages/runtime-core/src/index.ts

diff --git a/packages/runtime-core/src/apiState.ts b/packages/runtime-core/src/apiState.ts
new file mode 100644 (file)
index 0000000..9b971c2
--- /dev/null
@@ -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<T, C = null>(
+  getter: () => T,
+  setter?: (v: T) => void
+): ComputedValue<T> {
+  const c = _computed(getter, setter)
+  recordEffect(c.effect)
+  return c
+}
similarity index 69%
rename from packages/runtime-core/src/reactivity.ts
rename to packages/runtime-core/src/apiWatch.ts
index 12adfc128eae3a17d51c113737d9c82705fd3114..f8de749fc2e49df6ff8d72e20c75c3cbe349f98a 100644 (file)
@@ -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<T, C = null>(
-  getter: () => T,
-  setter?: (v: T) => void
-): ComputedValue<T> {
-  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<T> = Value<T> | (() => T)
+
 const invoke = (fn: Function) => fn()
 
 export function watch<T>(
-  source: Value<T> | (() => T),
+  source: WatcherSource<T> | WatcherSource<T>[],
   cb?: <V extends T>(
     newValue: V,
     oldValue: V,
@@ -73,7 +33,11 @@ export function watch<T>(
   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
index 46d547da01d298b16af5bb803b132f67cab84215..573259cabc1d0e4224435aba466eea20f32a14be 100644 (file)
@@ -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'