-
-
Notifications
You must be signed in to change notification settings - Fork 33.8k
Description
What problem does this feature solve?
Following this discussion, given a CustomInput component with this template:
<div>
<input v-bind="$attrs" v-on="$listeners">
<div>The following currently does not work:
<CustomInput v-model="myValue" />The problem is that v-model on a component expects a value on input events, but a DOM Event is passed to the listener instead.
What does the proposed API look like?
Option 1: Make v-model smarter
Since I think it's unlikely that anyone will want to use v-model with a DOM Event, perhaps when v-model is used on components, it could check if the argument passed to the listener is instanceof window.Event. Then if it is, use event.target.value instead.
Option 2: Make v-on smarter
Maybe a non-enumerable property could be added to $listeners (e.g. __$listeners__: true, to help v-on detect uses of v-on="$listeners". Then in cases where the $listeners object is passed to v-on and it's used on an element, listeners relevant to v-model could be wrapped:
function (event) {
listener(event.target.value)
}But now we're throwing away data. If someone wants to access a keyCode - e.g. with @input instead of v-model - they're out of luck. However, if modifiers were also supported for v-on's object syntax, we could fix this by making .native disable the automatic wrapping behavior.
Thoughts? Are there strategies or implications I'm not considering? I'm definitely open to alternatives.