From 526fa3b2ccf038375e76f8af2f1ddf79a7388878 Mon Sep 17 00:00:00 2001 From: Evan You Date: Fri, 21 Apr 2023 15:54:03 +0800 Subject: [PATCH] feat(deprecation): unwrap injected refs in Options API by default, deprecate app.config.unwrapInjectedRefs --- .../runtime-core/__tests__/apiOptions.spec.ts | 35 ------------------ packages/runtime-core/src/apiCreateApp.ts | 19 +++++++++- packages/runtime-core/src/componentOptions.ts | 37 +++++-------------- 3 files changed, 27 insertions(+), 64 deletions(-) diff --git a/packages/runtime-core/__tests__/apiOptions.spec.ts b/packages/runtime-core/__tests__/apiOptions.spec.ts index eebf0bacffb..a172196d3f7 100644 --- a/packages/runtime-core/__tests__/apiOptions.spec.ts +++ b/packages/runtime-core/__tests__/apiOptions.spec.ts @@ -451,8 +451,6 @@ describe('api: options', () => { } }) const app = createApp(Parent) - // TODO remove in 3.3 - app.config.unwrapInjectedRef = true const root = nodeOps.createElement('div') app.mount(root) expect(serializeInner(root)).toBe(`1`) @@ -462,39 +460,6 @@ describe('api: options', () => { expect(serializeInner(root)).toBe(`3`) }) - // TODO remove in 3.3 - test('provide/inject refs (compat)', async () => { - const n = ref(0) - const np = computed(() => n.value + 1) - const Parent = defineComponent({ - provide() { - return { - n, - np - } - }, - render: () => h(Child) - }) - const Child = defineComponent({ - inject: ['n', 'np'], - render(this: any) { - return this.n.value + this.np.value - } - }) - const app = createApp(Parent) - - const root = nodeOps.createElement('div') - app.mount(root) - expect(serializeInner(root)).toBe(`1`) - - n.value++ - await nextTick() - expect(serializeInner(root)).toBe(`3`) - - expect(`injected property "n" is a ref`).toHaveBeenWarned() - expect(`injected property "np" is a ref`).toHaveBeenWarned() - }) - test('provide accessing data in extends', () => { const Base = defineComponent({ data() { diff --git a/packages/runtime-core/src/apiCreateApp.ts b/packages/runtime-core/src/apiCreateApp.ts index 6b698ba26c2..15f7766f323 100644 --- a/packages/runtime-core/src/apiCreateApp.ts +++ b/packages/runtime-core/src/apiCreateApp.ts @@ -110,9 +110,10 @@ export interface AppConfig { */ isCustomElement?: (tag: string) => boolean + // TODO remove in 3.4 /** * Temporary config for opt-in to unwrap injected refs. - * TODO deprecate in 3.3 + * @deprecated this no longer has effect. 3.3 always unwraps injected refs. */ unwrapInjectedRef?: boolean } @@ -210,6 +211,22 @@ export function createAppAPI( } const context = createAppContext() + + // TODO remove in 3.4 + if (__DEV__) { + Object.defineProperty(context.config, 'unwrapInjectedRef', { + get() { + return true + }, + set() { + warn( + `app.config.unwrapInjectedRef has been deprecated. ` + + `3.3 now alawys unwraps injected refs in Options API.` + ) + } + }) + } + const installedPlugins = new Set() let isMounted = false diff --git a/packages/runtime-core/src/componentOptions.ts b/packages/runtime-core/src/componentOptions.ts index bba5ade9ad4..52768659635 100644 --- a/packages/runtime-core/src/componentOptions.ts +++ b/packages/runtime-core/src/componentOptions.ts @@ -675,12 +675,7 @@ export function applyOptions(instance: ComponentInternalInstance) { // - watch (deferred since it relies on `this` access) if (injectOptions) { - resolveInjections( - injectOptions, - ctx, - checkDuplicateProperties, - instance.appContext.config.unwrapInjectedRef - ) + resolveInjections(injectOptions, ctx, checkDuplicateProperties) } if (methods) { @@ -884,8 +879,7 @@ export function applyOptions(instance: ComponentInternalInstance) { export function resolveInjections( injectOptions: ComponentInjectOptions, ctx: any, - checkDuplicateProperties = NOOP as any, - unwrapRef = false + checkDuplicateProperties = NOOP as any ) { if (isArray(injectOptions)) { injectOptions = normalizeInject(injectOptions)! @@ -907,26 +901,13 @@ export function resolveInjections( injected = inject(opt) } if (isRef(injected)) { - // TODO remove the check in 3.3 - if (unwrapRef) { - Object.defineProperty(ctx, key, { - enumerable: true, - configurable: true, - get: () => (injected as Ref).value, - set: v => ((injected as Ref).value = v) - }) - } else { - if (__DEV__) { - warn( - `injected property "${key}" is a ref and will be auto-unwrapped ` + - `and no longer needs \`.value\` in the next minor release. ` + - `To opt-in to the new behavior now, ` + - `set \`app.config.unwrapInjectedRef = true\` (this config is ` + - `temporary and will not be needed in the future.)` - ) - } - ctx[key] = injected - } + // unwrap injected refs (ref #4196) + Object.defineProperty(ctx, key, { + enumerable: true, + configurable: true, + get: () => (injected as Ref).value, + set: v => ((injected as Ref).value = v) + }) } else { ctx[key] = injected }