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.