Bläddra i källkod

fix(script-setup): ensure useContext() return valid context

Evan You 5 år sedan
förälder
incheckning
73cdb9d420
2 ändrade filer med 13 tillägg och 3 borttagningar
  1. 10 2
      packages/runtime-core/src/apiSetupHelpers.ts
  2. 3 1
      packages/runtime-core/src/component.ts

+ 10 - 2
packages/runtime-core/src/apiSetupHelpers.ts

@@ -1,4 +1,8 @@
-import { getCurrentInstance, SetupContext } from './component'
+import {
+  getCurrentInstance,
+  SetupContext,
+  createSetupContext
+} from './component'
 import { EmitFn, EmitsOptions } from './componentEmits'
 import { ComponentObjectPropsOptions, ExtractPropTypes } from './componentProps'
 import { warn } from './warning'
@@ -53,5 +57,9 @@ export function defineEmit(emitOptions?: any) {
 }
 
 export function useContext(): SetupContext {
-  return getCurrentInstance()!.setupContext!
+  const i = getCurrentInstance()!
+  if (__DEV__ && !i) {
+    warn(`useContext() called without active instance.`)
+  }
+  return i.setupContext || (i.setupContext = createSetupContext(i))
 }

+ 3 - 1
packages/runtime-core/src/component.ts

@@ -746,7 +746,9 @@ const attrHandlers: ProxyHandler<Data> = {
   }
 }
 
-function createSetupContext(instance: ComponentInternalInstance): SetupContext {
+export function createSetupContext(
+  instance: ComponentInternalInstance
+): SetupContext {
   const expose: SetupContext['expose'] = exposed => {
     if (__DEV__ && instance.exposed) {
       warn(`expose() should be called only once per setup().`)