]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
wip: provide/inject
authorEvan You <yyx990803@gmail.com>
Wed, 19 Jun 2019 09:31:49 +0000 (17:31 +0800)
committerEvan You <yyx990803@gmail.com>
Wed, 19 Jun 2019 09:31:49 +0000 (17:31 +0800)
packages/runtime-core/src/apiInject.ts [new file with mode: 0644]
packages/runtime-core/src/component.ts
packages/runtime-core/src/index.ts

diff --git a/packages/runtime-core/src/apiInject.ts b/packages/runtime-core/src/apiInject.ts
new file mode 100644 (file)
index 0000000..7c9e64e
--- /dev/null
@@ -0,0 +1,30 @@
+import { value, isValue, Value } from './apiState'
+import { currentInstance } from './component'
+
+export interface Key<T> extends Symbol {}
+
+export function provide<T>(key: Key<T>, value: T | Value<T>) {
+  if (!currentInstance) {
+    // TODO warn
+  } else {
+    const provides = currentInstance.provides || (currentInstance.provides = {})
+    provides[key as any] = value
+  }
+}
+
+export function inject<T>(key: Key<T>): Value<T> | undefined {
+  // traverse parent chain and look for provided value
+  if (!currentInstance) {
+    // TODO warn
+  } else {
+    let parent = currentInstance.parent
+    while (parent) {
+      const { provides } = parent
+      if (provides !== null && provides.hasOwnProperty(key as any)) {
+        const val = provides[key as any]
+        return isValue(val) ? val : value(val)
+      }
+      parent = parent.parent
+    }
+  }
+}
index 13ccb6d95200e9601071ea67c4f0a6f522742e10..35886d68d7141766bfb9012ede6d932a351a6893 100644 (file)
@@ -79,7 +79,7 @@ export interface FunctionalComponent<P = {}> {
 
 type LifecycleHook = Function[] | null
 
-interface LifecycleHooks {
+export interface LifecycleHooks {
   bm: LifecycleHook // beforeMount
   m: LifecycleHook // mounted
   bu: LifecycleHook // beforeUpdate
@@ -110,8 +110,9 @@ export type ComponentInstance<P = Data, S = Data> = {
   next: VNode | null
   subTree: VNode
   update: ReactiveEffect
-  effects: ReactiveEffect[] | null
   render: RenderFunction<P, S> | null
+  effects: ReactiveEffect[] | null
+  provides: Data | null
 
   // the rest are only for stateful components
   data: S
@@ -193,6 +194,7 @@ export function createComponentInstance(
     rtc: null,
     ec: null,
     effects: null,
+    provides: null,
 
     // public properties
     data: EMPTY_OBJ,
index 573259cabc1d0e4224435aba466eea20f32a14be..ef37291a75d9b9abdaab25c1a94f81f52794fe53 100644 (file)
@@ -18,5 +18,6 @@ export { PropType, ComponentPropsOptions } from './componentProps'
 export * from './apiState'
 export * from './apiWatch'
 export * from './apiLifecycle'
+export * from './apiInject'
 export * from './patchFlags'
 export * from './typeFlags'