v-model
v-model
指定可以實現表單值與屬性的雙向繫結。即表單元素中更改了值會自動的更新屬性中的值,屬性中的值更新了會自動更新表單中的值
繫結的屬性和事件
v-model
在內部為不同的輸入元素使用不同的屬性並丟擲不同的事件:
1.text
和textarea
元素使用value
屬性和input
事件。
2.checkbox
和radio
使用checked
屬性和change
事件。
3.select
欄位將value
作為prop
並將change
作為事件。
表單元素繫結
input繫結
<input v-model="message" placeholder="請輸入...">
<p>輸入的內容是:{{ message }}</p>
textarea繫結
<span>輸入的內容是:</span>
<p style="white-space: pre-line;">{{ message }}</p>
<br>
<textarea v-model="message" placeholder="請輸入多行內容..."></textarea>
checkbox繫結
多個核取方塊,繫結到同一個陣列
<div id="app">
<input type="checkbox" id="basketball" value="籃球" v-model="hobby">
<label for="basketball">籃球</label>
<input type="checkbox" id="football" value="足球" v-model="hobby">
<label for="football">足球</label>
<input type="checkbox" id="volleyball" value="排球" v-model="hobby">
<label for="volleyball">排球</label>
<p>{{hobby}}</p>
</div>
<script>
const app = new Vue({
el: "#app",
data: {
hobby: []
}
})
</script>
radio繫結
<div id="app">
<input type="radio" id="one" value="One" v-model="picked">
<label for="one">One</label>
<br>
<input type="radio" id="two" value="Two" v-model="picked">
<label for="two">Two</label>
<br>
<span>Picked: {{ picked }}</span>
</div>
new Vue({
el: '#app',
data: {
picked: ''
}
})
select繫結
單選時:
<div id="#app">
<select v-model="selected">
<option disabled value="">請選擇</option>
<option>A</option>
<option>B</option>
<option>C</option>
</select>
<span>Selected: {{ selected }}</span>
</div>
new Vue({
el: '...',
data: {
selected: ''
}
})
多選時,只需加上multiple
屬性即可
<div id="#app">
<select v-model="selected" multiple style="width: 50px;">
<option>A</option>
<option>B</option>
<option>C</option>
</select>
<br>
<span>Selected: {{ selected }}</span>
</div>
值繫結
對於單選按鈕,核取方塊及選擇框的選項,v-model
繫結的值通常是靜態字串 (對於核取方塊也可以是布林值)
但是有時我們可能想把值繫結到 Vue
例項的一個動態 property
上,這時可以用 v-bind
實現,並且這個 property
的值可以不是字串。
<div id="app">
<label v-for="hobby in hobbies">
<input type="checkbox" :id="hobby" :value="hobby" v-model="testHobby">{{hobby}}
</label>
<p>{{testHobby}}</p>
</div>
<script>
const app = new Vue({
el: "#app",
data: {
hobbies: ["籃球", "足球", "羽毛球", "乒乓球", "網球"],
testHobby: []
}
})
</script>
程式碼詳解
1.我們在data
中建立了hobbies
陣列,這裡是為了模擬後端返回的資料,資料是動態的
2.又定義了陣列testHobby
,這是將核取方塊中的資料與它進行繫結,只要勾選了核取方塊中的資料,就會將其新增到testHobby
中
3.使用了for
迴圈,將hobbies
資料中的資料遍歷出來
4.input
標籤中繫結了id
屬性,value
屬性,值為遍歷出來的資料,之後開啟網頁原始碼中可以看到
5.v-model將input
標籤與testHobby
繫結
最後我們檢視下繫結的效果,與繫結後的網頁原始碼
我們可以看到繫結後id
和value
的值都是遍歷後的hobby
修飾符
.lazy
在預設情況下,v-model
在每次 input
事件觸發後將輸入框的值與資料進行同步 (除了上述輸入法組合文字時)。你可以新增 lazy
修飾符,從而轉為在 change
事件_之後_進行同步:
<!-- 在“change”時而非“input”時更新 -->
<input v-model.lazy="msg">
.number
如果想自動將使用者的輸入值轉為數值型別,可以給 v-model
新增 number
修飾符:
<input v-model.number="age" type="number">
這通常很有用,因為即使在 type="number"
時,HTML
輸入元素的值也總會返回字串。如果這個值無法被 parseFloat()
解析,則會返回原始的值。
.trim
如果要自動過濾使用者輸入的首尾空白字元,可以給 v-model
新增 trim
修飾符:
<input v-model.trim="msg">