From f57aa2f7de9fccc7a5346f311237dd9f725d2542 Mon Sep 17 00:00:00 2001 From: pikax Date: Sat, 5 Sep 2020 08:49:00 +0100 Subject: [PATCH] feat(inject): add `treatDefaultAsFactory` argument --- src/apis/inject.ts | 19 +++++++++++++------ test/apis/inject.spec.js | 21 +++++++++++++++++++++ 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/src/apis/inject.ts b/src/apis/inject.ts index 29b5723c..dd71aaae 100644 --- a/src/apis/inject.ts +++ b/src/apis/inject.ts @@ -1,5 +1,5 @@ import { ComponentInstance } from '../component' -import { hasOwn, warn, currentVMInFn } from '../utils' +import { hasOwn, warn, currentVMInFn, isFunction } from '../utils' import { getCurrentInstance } from '../runtimeContext' const NOT_FOUND = {} @@ -38,10 +38,15 @@ export function provide(key: InjectionKey | string, value: T): void { } export function inject(key: InjectionKey | string): T | undefined -export function inject(key: InjectionKey | string, defaultValue: T): T +export function inject( + key: InjectionKey | string, + defaultValue: T, + treatDefaultAsFactory?: boolean +): T export function inject( key: InjectionKey | string, - defaultValue?: unknown + defaultValue?: unknown, + treatDefaultAsFactory = false ) { if (!key) { return defaultValue @@ -55,12 +60,14 @@ export function inject( const val = resolveInject(key, vm) if (val !== NOT_FOUND) { - return val; + return val } - + if (defaultValue === undefined && __DEV__) { warn(`Injection "${String(key)}" not found`, vm) } - return defaultValue + return treatDefaultAsFactory && isFunction(defaultValue) + ? defaultValue() + : defaultValue } diff --git a/test/apis/inject.spec.js b/test/apis/inject.spec.js index 9954028b..b2a817f8 100644 --- a/test/apis/inject.spec.js +++ b/test/apis/inject.spec.js @@ -145,4 +145,25 @@ describe('Hooks provide/inject', () => { expect(obj1.msg).toBe('foo') expect(obj2.msg).toBe('bar') }) + + it('should call default value as factory', () => { + const State = Symbol() + let fn = jest.fn() + new Vue({ + template: ``, + setup() {}, + provide: { + X: { msg: 'bar' }, + }, + components: { + child: { + setup() { + inject(State, fn, true) + }, + template: `
`, + }, + }, + }).$mount() + expect(fn).toHaveBeenCalled() + }) })