Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 | 2x 2x 54x 54x 54x 54x 54x 54x 54x 54x 54x 9x 9x 54x 54x 54x 2x 90x 90x 90x 90x 90x 90x 89x 3x 86x 86x 32x 54x 89x 76x 89x 10x 3x 7x 13x 3x 3x 90x 1x 1x 90x 2x 3x 3x | import { isFunction } from '@vue/shared' import { currentInstance, getCurrentInstance } from './component' import { currentApp } from './apiCreateApp' import { warn } from './warning' interface InjectionConstraint<T> {} export type InjectionKey<T> = symbol & InjectionConstraint<T> export function provide<T, K = InjectionKey<T> | string | number>( key: K, value: K extends InjectionKey<infer V> ? V : T, ): void { if (!currentInstance) { if (__DEV__) { warn(`provide() can only be used inside setup().`) } } else { let provides = currentInstance.provides // by default an instance inherits its parent's provides object // but when it needs to provide values of its own, it creates its // own provides object using parent provides object as prototype. // this way in `inject` we can simply look up injections from direct // parent and let the prototype chain do the work. const parentProvides = currentInstance.parent && currentInstance.parent.provides if (parentProvides === provides) { provides = currentInstance.provides = Object.create(parentProvides) } // TS doesn't allow symbol as index type provides[key as string] = value } } export function inject<T>(key: InjectionKey<T> | string): T | undefined export function inject<T>( key: InjectionKey<T> | string, defaultValue: T, treatDefaultAsFactory?: false, ): T export function inject<T>( key: InjectionKey<T> | string, defaultValue: T | (() => T), treatDefaultAsFactory: true, ): T export function inject( key: InjectionKey<any> | string, defaultValue?: unknown, treatDefaultAsFactory = false, ) { // fallback to `currentRenderingInstance` so that this can be called in // a functional component const instance = getCurrentInstance() // also support looking up from app-level provides w/ `app.runWithContext()` if (instance || currentApp) { // #2400 // to support `app.use` plugins, // fallback to appContext's `provides` if the instance is at root // #11488, in a nested createApp, prioritize using the provides from currentApp // #13212, for custom elements we must get injected values from its appContext // as it already inherits the provides object from the parent element let provides = currentApp ? currentApp._context.provides : instance ? instance.parent == null || instance.ce ? instance.vnode.appContext && instance.vnode.appContext.provides : instance.parent.provides : undefined if (provides && (key as string | symbol) in provides) { // TS doesn't allow symbol as index type return provides[key as string] } else if (arguments.length > 1) { return treatDefaultAsFactory && isFunction(defaultValue) ? defaultValue.call(instance && instance.proxy) : defaultValue } else if (__DEV__) { warn(`injection "${String(key)}" not found.`) } } else if (__DEV__) { warn(`inject() can only be used inside setup() or functional components.`) } } /** * Returns true if `inject()` can be used without warning about being called in the wrong place (e.g. outside of * setup()). This is used by libraries that want to use `inject()` internally without triggering a warning to the end * user. One example is `useRoute()` in `vue-router`. */ export function hasInjectionContext(): boolean { return !!(getCurrentInstance() || currentApp) } |