})
test('provide/inject', () => {
- const Root = {
+ const Root = defineComponent({
data() {
return {
a: 1
}
},
render() {
- return [h(ChildA), h(ChildB), h(ChildC), h(ChildD)]
- }
- } as any
- const ChildA = {
- inject: ['a'],
- render() {
- return this.a
- }
- } as any
- const ChildB = {
- // object alias
- inject: { b: 'a' },
- render() {
- return this.b
+ return [h(ChildA), h(ChildB), h(ChildC), h(ChildD), h(ChildE)]
}
- } as any
- const ChildC = {
- inject: {
- b: {
- from: 'a'
+ })
+
+ const defineChild = (injectOptions: any, injectedKey = 'b') =>
+ ({
+ inject: injectOptions,
+ render() {
+ return this[injectedKey]
}
- },
- render() {
- return this.b
+ } as any)
+
+ const ChildA = defineChild(['a'], 'a')
+ const ChildB = defineChild({ b: 'a' })
+ const ChildC = defineChild({
+ b: {
+ from: 'a'
}
- } as any
- const ChildD = {
- inject: {
- b: {
- from: 'c',
- default: 2
- }
- },
- render() {
- return this.b
+ })
+ const ChildD = defineChild({
+ b: {
+ from: 'c',
+ default: 2
}
- } as any
-
- expect(renderToString(h(Root))).toBe(`1112`)
+ })
+ const ChildE = defineChild({
+ b: {
+ from: 'c',
+ default: () => 3
+ }
+ })
+ expect(renderToString(h(Root))).toBe(`11123`)
})
test('lifecycle', async () => {
+import { isFunction } from '@vue/shared'
import { currentInstance } from './component'
import { currentRenderingInstance } from './componentRenderUtils'
import { warn } from './warning'
}
export function inject<T>(key: InjectionKey<T> | string): T | undefined
-export function inject<T>(key: InjectionKey<T> | string, defaultValue: T): T
+export function inject<T>(
+ key: InjectionKey<T> | string,
+ defaultValue: T,
+ treatDefaultAsFactory?: boolean
+): T
export function inject(
key: InjectionKey<any> | string,
- defaultValue?: unknown
+ defaultValue?: unknown,
+ treatDefaultAsFactory = false
) {
// fallback to `currentRenderingInstance` so that this can be called in
// a functional component
// TS doesn't allow symbol as index type
return provides[key as string]
} else if (arguments.length > 1) {
- return defaultValue
+ return treatDefaultAsFactory && isFunction(defaultValue)
+ ? defaultValue()
+ : defaultValue
} else if (__DEV__) {
warn(`injection "${String(key)}" not found.`)
}
for (const key in injectOptions) {
const opt = injectOptions[key]
if (isObject(opt)) {
- ctx[key] = inject(opt.from, opt.default)
+ ctx[key] = inject(
+ opt.from,
+ opt.default,
+ true /* treat default function as factory */
+ )
} else {
ctx[key] = inject(opt)
}