From 72130ac7b598fcb6a24168bd143f4acd1f38284b Mon Sep 17 00:00:00 2001 From: Soha Jin Date: Fri, 21 Jan 2022 15:02:02 +0800 Subject: [PATCH] fix(compat): convertLegacyVModelProps should merge model option in mixins (#5251) --- .../src/compat/componentVModel.ts | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/packages/runtime-core/src/compat/componentVModel.ts b/packages/runtime-core/src/compat/componentVModel.ts index e179c3b1d41..b446fb4274d 100644 --- a/packages/runtime-core/src/compat/componentVModel.ts +++ b/packages/runtime-core/src/compat/componentVModel.ts @@ -1,4 +1,4 @@ -import { ShapeFlags } from '@vue/shared' +import { extend, ShapeFlags } from '@vue/shared' import { ComponentInternalInstance, ComponentOptions } from '../component' import { callWithErrorHandling, ErrorCodes } from '../errorHandling' import { VNode } from '../vnode' @@ -15,6 +15,7 @@ const warnedTypes = new WeakSet() export function convertLegacyVModelProps(vnode: VNode) { const { type, shapeFlag, props, dynamicProps } = vnode + const comp = type as ComponentOptions if (shapeFlag & ShapeFlags.COMPONENT && props && 'modelValue' in props) { if ( !isCompatEnabled( @@ -28,17 +29,19 @@ export function convertLegacyVModelProps(vnode: VNode) { return } - if (__DEV__ && !warnedTypes.has(type as ComponentOptions)) { + if (__DEV__ && !warnedTypes.has(comp)) { pushWarningContext(vnode) - warnDeprecation(DeprecationTypes.COMPONENT_V_MODEL, { type } as any, type) + warnDeprecation(DeprecationTypes.COMPONENT_V_MODEL, { type } as any, comp) popWarningContext() - warnedTypes.add(type as ComponentOptions) + warnedTypes.add(comp) } // v3 compiled model code -> v2 compat props // modelValue -> value // onUpdate:modelValue -> onModelCompat:input - const { prop = 'value', event = 'input' } = (type as any).model || {} + const model = comp.model || {} + applyModelFromMixins(model, comp.mixins) + const { prop = 'value', event = 'input' } = model if (prop !== 'modelValue') { props[prop] = props.modelValue delete props.modelValue @@ -52,6 +55,15 @@ export function convertLegacyVModelProps(vnode: VNode) { } } +function applyModelFromMixins(model: any, mixins?: ComponentOptions[]) { + if (mixins) { + mixins.forEach(m => { + if (m.model) extend(model, m.model) + if (m.mixins) applyModelFromMixins(model, m.mixins) + }) + } +} + export function compatModelEmit( instance: ComponentInternalInstance, event: string,