From a99e87d6e74c05964c8e4f10b341ac1c48fd569b Mon Sep 17 00:00:00 2001 From: daiwei Date: Mon, 15 Dec 2025 14:46:21 +0800 Subject: [PATCH 1/3] fix(compat): pass appContext to v-model deprecation warning --- .../src/compat/componentVModel.ts | 10 ++++- .../__tests__/componentVModel.spec.ts | 37 +++++++++++++++++++ 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/packages/runtime-core/src/compat/componentVModel.ts b/packages/runtime-core/src/compat/componentVModel.ts index 7a9fea9bff8..a994a67729d 100644 --- a/packages/runtime-core/src/compat/componentVModel.ts +++ b/packages/runtime-core/src/compat/componentVModel.ts @@ -1,5 +1,6 @@ import { ShapeFlags, extend } from '@vue/shared' import type { ComponentInternalInstance, ComponentOptions } from '../component' +import { createAppContext } from '../apiCreateApp' import { ErrorCodes, callWithErrorHandling } from '../errorHandling' import type { VNode } from '../vnode' import { popWarningContext, pushWarningContext } from '../warning' @@ -31,7 +32,14 @@ export function convertLegacyVModelProps(vnode: VNode): void { if (__DEV__ && !warnedTypes.has(comp)) { pushWarningContext(vnode) - warnDeprecation(DeprecationTypes.COMPONENT_V_MODEL, { type } as any, comp) + warnDeprecation( + DeprecationTypes.COMPONENT_V_MODEL, + { + type, + appContext: (vnode.ctx && vnode.ctx.appContext) || createAppContext(), + } as any, + comp, + ) popWarningContext() warnedTypes.add(comp) } diff --git a/packages/vue-compat/__tests__/componentVModel.spec.ts b/packages/vue-compat/__tests__/componentVModel.spec.ts index 5ef19954734..aed2e5391ed 100644 --- a/packages/vue-compat/__tests__/componentVModel.spec.ts +++ b/packages/vue-compat/__tests__/componentVModel.spec.ts @@ -140,4 +140,41 @@ describe('COMPONENT_V_MODEL', () => { template: ``, }) }) + + // #14202 + test('should not crash', async () => { + const ChildComponent = { + template: `
{{ value }}
`, + props: ['value'], + } + + const vm = new Vue({ + components: { ChildComponent }, + data() { + return { + myVal: 'initial', + } + }, + template: ` +
+ +
+ `, + }).$mount() as any + + expect(vm.$el.textContent).toContain('initial') + + expect( + (deprecationData[DeprecationTypes.COMPONENT_V_MODEL].message as Function)( + ChildComponent, + ), + ).toHaveBeenWarned() + + // Should work correctly + const child = vm.$el.querySelector('div') + child.click() + await nextTick() + expect(vm.myVal).toBe('new val') + expect(vm.$el.textContent).toContain('new val') + }) }) From 67bbe317f43c1129314890e7131a6cdaa437a289 Mon Sep 17 00:00:00 2001 From: edison Date: Mon, 15 Dec 2025 14:49:37 +0800 Subject: [PATCH 2/3] Update packages/vue-compat/__tests__/componentVModel.spec.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- packages/vue-compat/__tests__/componentVModel.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vue-compat/__tests__/componentVModel.spec.ts b/packages/vue-compat/__tests__/componentVModel.spec.ts index aed2e5391ed..1847454395e 100644 --- a/packages/vue-compat/__tests__/componentVModel.spec.ts +++ b/packages/vue-compat/__tests__/componentVModel.spec.ts @@ -142,7 +142,7 @@ describe('COMPONENT_V_MODEL', () => { }) // #14202 - test('should not crash', async () => { + test('should handle v-model deprecation warning with missing appContext (#14202)', async () => { const ChildComponent = { template: `
{{ value }}
`, props: ['value'], From ecf7c0d21811543b2c9df81e0023d812b6a92510 Mon Sep 17 00:00:00 2001 From: edison Date: Mon, 15 Dec 2025 14:52:00 +0800 Subject: [PATCH 3/3] Update packages/vue-compat/__tests__/componentVModel.spec.ts --- packages/vue-compat/__tests__/componentVModel.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vue-compat/__tests__/componentVModel.spec.ts b/packages/vue-compat/__tests__/componentVModel.spec.ts index 1847454395e..0c85d3f289e 100644 --- a/packages/vue-compat/__tests__/componentVModel.spec.ts +++ b/packages/vue-compat/__tests__/componentVModel.spec.ts @@ -142,7 +142,7 @@ describe('COMPONENT_V_MODEL', () => { }) // #14202 - test('should handle v-model deprecation warning with missing appContext (#14202)', async () => { + test('should handle v-model deprecation warning with missing appContext', async () => { const ChildComponent = { template: `
{{ value }}
`, props: ['value'],