@@ -17,6 +17,7 @@ import { handleError, ErrorCodes } from './errorHandling'
17
17
import { PatchFlags , ShapeFlags , isOn , isModelListener } from '@vue/shared'
18
18
import { warn } from './warning'
19
19
import { isHmrUpdating } from './hmr'
20
+ import { NormalizedProps } from './componentProps'
20
21
21
22
// mark the current rendering instance for asset resolution (e.g.
22
23
// resolveComponent, resolveDirective) during render
@@ -46,6 +47,7 @@ export function renderComponentRoot(
46
47
proxy,
47
48
withProxy,
48
49
props,
50
+ propsOptions : [ propsOptions ] ,
49
51
slots,
50
52
attrs,
51
53
emit,
@@ -125,11 +127,15 @@ export function renderComponentRoot(
125
127
shapeFlag & ShapeFlags . ELEMENT ||
126
128
shapeFlag & ShapeFlags . COMPONENT
127
129
) {
128
- if ( shapeFlag & ShapeFlags . ELEMENT && keys . some ( isModelListener ) ) {
129
- // #1643, #1543
130
- // component v-model listeners should only fallthrough for component
131
- // HOCs
132
- fallthroughAttrs = filterModelListeners ( fallthroughAttrs )
130
+ if ( propsOptions && keys . some ( isModelListener ) ) {
131
+ // If a v-model listener (onUpdate:xxx) has a corresponding declared
132
+ // prop, it indicates this component expects to handle v-model and
133
+ // it should not fallthrough.
134
+ // related: #1543, #1643, #1989
135
+ fallthroughAttrs = filterModelListeners (
136
+ fallthroughAttrs ,
137
+ propsOptions
138
+ )
133
139
}
134
140
root = cloneVNode ( root , fallthroughAttrs )
135
141
} else if ( __DEV__ && ! accessedAttrs && root . type !== Comment ) {
@@ -251,10 +257,10 @@ const getFunctionalFallthrough = (attrs: Data): Data | undefined => {
251
257
return res
252
258
}
253
259
254
- const filterModelListeners = ( attrs : Data ) : Data => {
260
+ const filterModelListeners = ( attrs : Data , props : NormalizedProps ) : Data => {
255
261
const res : Data = { }
256
262
for ( const key in attrs ) {
257
- if ( ! isModelListener ( key ) ) {
263
+ if ( ! isModelListener ( key ) || ! ( key . slice ( 9 ) in props ) ) {
258
264
res [ key ] = attrs [ key ]
259
265
}
260
266
}
0 commit comments