<input v-model="something">
v-model指令實際上是下面的語法糖包裝而成:html
<input :value="something" @:input="something = $event.target.value">
在一個組件上使用 v-model 時,會簡化爲:vue
<custom-input :value="something" @input="value => { something = value }"> </custom-input>
所以,對於一個帶有 v-model
的組件,它應該以下:ide
value
propinput
事件,並傳入新值利用 $emit 觸發 input 事件:ui
this.$emit('input', value);
組件1:this
Vue.component('my-component', { template: `<div> <input type="text" :value="currentValue" @input="handleInput"/> </div>`, computed:{ currentValue:function () { return this.value } }, props: ['value'], //接收一個 value prop methods: { handleInput(event) { var value = event.target.value; this.$emit('input', value); //觸發 input 事件,並傳入新值 } } });
上面是將prop屬性綁定到data裏,以便修改 prop 數據(Vue不容許直接修改prop屬性的值)#查看原理#
組件2:spa
Vue.component("my-counter", { template: `<div> <h1>{{value}}</h1> <button @click="plus">+</button> <button @click="minu">-</button> </div>`, props: { value: Number //接收一個 value prop }, data: function() { return { val: this.value } }, methods: { plus() { this.val = this.val + 1 this.$emit('input', this.val) //觸發 input 事件,並傳入新值 }, minu() { if(this.val>0){ this.val = this.val-1 this.$emit('input', this.val) //觸發 input 事件,並傳入新值 } } } });
查看在線例子.net