表單類型是網頁很常見的呈現方式,表單元素有文字框<input>、<textarea>、<select>...等,用v-model的特性可以做到資料雙向綁定的功能,以下開始介紹。
input 文字框<div id="demo">
  <input type="text" v-model="message" placeholder="input text">
  {{ message }}
</div>
const vm = Vue.createApp({
  data() {
    return {
      message:'Hello Vue3',
    }
  }
});
vm.mount("#demo");
起手式在 input 加上 v-model="message" ,此時這輸入框文字有變動時,data 的 message 也會更新。
textarea 文字方塊<div id="app">
  <h2>{{ message }}</h2>
  <textarea v-model="message"></textarea>
</div>
const vm = Vue.createApp({
  data() {
    return {
      message:'hello Vue!',
    }
  }
}).mount('#app');
<textarea v-model="message"></textarea>,不能再放{{ }}會無法同步。
checked 選擇框<div id="demo">
  <input type="checkbox" id="one" value="one" v-model="checked">
  <label for="one">one</label>
  <input type="checkbox" id="two" value="two" v-model="checked">
  <label for="two">two</label>
  <input type="checkbox" id="three" value="three" v-model="checked">
  <label for="three">three</label>
  <br>
  <h3>checked data:{{ checked }}</h3>
</div>
const vm = Vue.createApp({
  data() {
    return {
      checked: [],
    }
  }
}).mount('#demo');
所有checked都要綁定一樣的v-model="checked",且data一定要是陣列,點擊第二個checked,畫面呈現:
checked 單選<div id="demo">
  <input type="checkbox" id="one" value="one" v-model="checked">
  <label for="one">Click Me!</label>
  <br>
  <h3>checked data:{{ checked }}</h3>
</div>
const vm = Vue.createApp({
  data() {
    return {
      checked: false,
    }
  }
}).mount('#demo');
data 的 checked 改為 false,預設就會沒打勾,當點選 checked 會再轉為 true,改為打勾狀態 。
radio 單選框<div id="demo">
  <input type="radio" id="one" value="1" v-model="checked">
  <label for="one">one</label>
  <input type="radio" id="two" value="2" v-model="checked">
  <label for="two">two</label>
  <input type="radio" id="three" value="3" v-model="checked">
  <label for="three">three</label>
  <br>
  <h3>checked data:{{ checked }}</h3>
</div>
const vm = Vue.createApp({
  data() {
    return {
      checked: 1,
    }
  }
}).mount('#demo');
跟checked多選框很相似,差別在於透過value指定他的值,點選時data裡的checked也同步更新為value的值:
select 下拉式選單<div id="demo">
  <select v-model="selected">
    <option disabled value="">請選擇</option>
    <option>北部</option>
    <option>中部</option>
    <option>南部</option>
  </select>
  <br>
  <h3>selected:{{ selected }}</h3>
</div>
const vm = Vue.createApp({
  data() {
    return {
      selected: '',
      
    }
  }
});
vm.mount('#demo');
v-model 必須放在 <select> 標籤裡,如果放在 <option> 標籤 ,會導致畫面雖然有更新,但 data 裡的selected根本沒有更新,維持空字串的狀態:
v-model 解析
大家現在都知道 v-model 是雙向綁定,只要 input 輸入什麼值, data 也會跟著更動,這都是靠ViewModel同時幫我們處理 DOM 的監聽和資料的綁動,v-model是對功能沒有影響,但更方便的使用,也就是語法糖,那我們來還原他本來的寫法:
<input :value="searchText" @input="searchText = $event.target.value">
input 綁定 value 屬性後,在對 input 事件監聽,觸發的同時,$event.target.value 回傳到 data 裡的 searchText 屬性。
methods 寫法:
  <div id="app">
      <input :value="text" @input="input($event)">
      <h1>{{ text }}</h1>
  </div>
const vm = Vue.createApp({
  data() {
    return {
      text: 'v-on,v-bind',
    }
  },
  methods:{
    input(event) {
      this.text = event.target.value;
    },
  }
});
vm.mount('#app');
1.在 methods 宣告一個 input監聽。
2.當 @input 觸發時 $event (事件物件)傳回 methods 的 input(event)。
3.event(原生事件).target(獲取該觸發事件的元素 button ).value再回傳給 Data 的 text。