Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 | 93x 93x 8884x 8884x 8884x 27x 15x 12x 5x 5x 5x 5x 12x 27x 27x 27x 12x 12x 12x 12x 12x 12x 12x 373x 66x 307x 307x 373x 5x | 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'
import {
DeprecationTypes,
isCompatEnabled,
warnDeprecation,
} from './compatConfig'
export const compatModelEventPrefix = `onModelCompat:`
const warnedTypes = new WeakSet()
export function convertLegacyVModelProps(vnode: VNode): void {
const { type, shapeFlag, props, dynamicProps } = vnode
const comp = type as ComponentOptions
if (shapeFlag & ShapeFlags.COMPONENT && props && 'modelValue' in props) {
if (
!isCompatEnabled(
DeprecationTypes.COMPONENT_V_MODEL,
// this is a special case where we want to use the vnode component's
// compat config instead of the current rendering instance (which is the
// parent of the component that exposes v-model)
{ type } as any,
)
) {
return
}
if (__DEV__ && !warnedTypes.has(comp)) {
pushWarningContext(vnode)
warnDeprecation(
DeprecationTypes.COMPONENT_V_MODEL,
{
type,
appContext: (vnode.ctx && vnode.ctx.appContext) || createAppContext(),
} as any,
comp,
)
popWarningContext()
warnedTypes.add(comp)
}
// v3 compiled model code -> v2 compat props
// modelValue -> value
// onUpdate:modelValue -> onModelCompat:input
const model = comp.model || {}
applyModelFromMixins(model, comp.mixins)
const { prop = 'value', event = 'input' } = model
if (prop !== 'modelValue') {
props[prop] = props.modelValue
delete props.modelValue
}
// important: update dynamic props
Eif (dynamicProps) {
dynamicProps[dynamicProps.indexOf('modelValue')] = prop
}
props[compatModelEventPrefix + event] = props['onUpdate:modelValue']
delete props['onUpdate:modelValue']
}
}
function applyModelFromMixins(model: any, mixins?: ComponentOptions[]) {
Iif (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,
args: any[],
): void {
if (!isCompatEnabled(DeprecationTypes.COMPONENT_V_MODEL, instance)) {
return
}
const props = instance.vnode.props
const modelHandler = props && props[compatModelEventPrefix + event]
if (modelHandler) {
callWithErrorHandling(
modelHandler,
instance,
ErrorCodes.COMPONENT_EVENT_HANDLER,
args,
)
}
}
|