在 vue 裡面我們可以透過 v-model 來取得輸入欄位的資料

<input v-model="message" />

其實他是做了以下的事情:

<input :value="message" @input="message = $event.target.value" />

 

如果直接在 component 上使用 v-model 是不會有效果的,這邊先在組件上設定 Props 屬性,並用指定 value 來綁定 input 的 value 值。

Vue.component('inputName',{
    props:['value'],
    template:`<div>
                  <input :value='value' >
              </div>`,
})

 

接著要處理 v-model 的@input="message = $event.target.value",但是我們 v-model 綁定的資料在父組件的 data 中,所以用 $emit 來控制和觸發父組件的事件。

<div id="input">
  <input-data v-model="nameVal"></input-data>
    <span>Hello, {{nameVal}}</span>
</div>

 

這一行

<input-name v-model="nameVal"></input-name>

等同於

<input-name :value="nameVal" @input="nameVal=$event.target.value"></input-name>

所以利用 @input="$emit('input', $event.target.value) 把值丟回去給父層。

component 寫成這樣:

Vue.component('inputData',{
    props:['value'],
    template:`<div>
                  <input :value='value' @input="$emit('input', $event.target.value)">
              </div>`,
})

let demoInput = new Vue({
    el:'#input',
    data:{
        nameVal:'',
    },
})

 

HTML 的部分就可用 v-model 接收了

<div id="input">
  <input-data v-model="nameVal"></input-data>
    <span>Hello, {{nameVal}}</span>
</div>