表單類型是網頁很常見的呈現方式,表單元素有文字框<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
。