Если вы не используете v-model
внутри своего пользовательского компонента формы, вам действительно нужно только
<b>My Input:</b> <br>
localValue: {{ value }} <br>
<input :value="value" @input="$emit('input', $event.target.value)">
Нет data
, нет watch
, вот и все.
См. https://vuejs.org/v2/guide/components.html#Using-v-model-on-Components
Если вы действительно хотите, чтобы что-то представляло значение, локальное для вашего компонента, документы Vue предпочитают использовать вычисленные значения над наблюдателями (ref: https://vuejs.org/v2/guide/computed.html#Watchers).
Идея состоит в том, чтобы создать вычисленное значение с помощью getter и setter для упрощения упрощенного одностороннего потока данных.
Vue.component('my-input', {
template: `<div><b>My Input:</b> <br>localValue: {{ localValue }} <br><input v-model="localValue"></div>`,
props: ['value'],
computed: {
localValue: {
get () {
return this.value
},
set (value) {
this.$emit('input', value)
}
}
}
})
new Vue({
el: '#app',
data: () => ({
parentValue: 'Inital value'
}),
methods: {
change () {
this.parentValue = 'Changed value'
}
}
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.3/vue.min.js"></script>
<div id="app">
<my-input v-model="parentValue"></my-input>
<button @click="change">Change</button><br>
parentValue: {{ parentValue }}
</div>