Переглянути джерело

feat(inject): allow usage in functional components

Evan You 6 роки тому
батько
коміт
e79c918676
1 змінених файлів з 7 додано та 3 видалено
  1. 7 3
      packages/runtime-core/src/apiInject.ts

+ 7 - 3
packages/runtime-core/src/apiInject.ts

@@ -1,4 +1,5 @@
 import { currentInstance } from './component'
+import { currentRenderingInstance } from './componentRenderUtils'
 import { warn } from './warning'
 
 export interface InjectionKey<T> extends Symbol {}
@@ -31,8 +32,11 @@ export function inject(
   key: InjectionKey<any> | string,
   defaultValue?: unknown
 ) {
-  if (currentInstance) {
-    const provides = currentInstance.provides
+  // fallback to `currentRenderingInstance` so that this can be called in
+  // a functional component
+  const instance = currentInstance || currentRenderingInstance
+  if (instance) {
+    const provides = instance.provides
     if (key in provides) {
       // TS doesn't allow symbol as index type
       return provides[key as string]
@@ -42,6 +46,6 @@ export function inject(
       warn(`injection "${String(key)}" not found.`)
     }
   } else if (__DEV__) {
-    warn(`inject() can only be used inside setup().`)
+    warn(`inject() can only be used inside setup() or functional components.`)
   }
 }