Vue 3.0 表單輸入綁定

2021-07-16 11:28 更新

#基礎(chǔ)用法

你可以用 v-model 指令在表單 <input><textarea><select> 元素上創(chuàng)建雙向數(shù)據(jù)綁定。它會(huì)根據(jù)控件類(lèi)型自動(dòng)選取正確的方法來(lái)更新元素。盡管有些神奇,但 v-model 本質(zhì)上不過(guò)是語(yǔ)法糖。它負(fù)責(zé)監(jiān)聽(tīng)用戶(hù)的輸入事件以更新數(shù)據(jù),并對(duì)一些極端場(chǎng)景進(jìn)行一些特殊處理。

提示

v-model 會(huì)忽略所有表單元素的 value、checked、selected attribute 的初始值而總是將當(dāng)前活動(dòng)實(shí)例的數(shù)據(jù)作為數(shù)據(jù)來(lái)源。你應(yīng)該通過(guò) JavaScript 在組件的 data 選項(xiàng)中聲明初始值。

v-model 在內(nèi)部為不同的輸入元素使用不同的 property 并拋出不同的事件:

  • text 和 textarea 元素使用 value property 和 input 事件;
  • checkbox 和 radio 使用 checked property 和 change 事件;
  • select 字段將 value 作為 prop 并將 change 作為事件。

提示

對(duì)于需要使用輸入法 (如中文、日文、韓文等) 的語(yǔ)言,你會(huì)發(fā)現(xiàn) v-model 不會(huì)在輸入法組織文字過(guò)程中得到更新。如果你也想處理這個(gè)過(guò)程,請(qǐng)使用 input 事件。

#文本 (Text)

  1. <input v-model="message" placeholder="edit me" />
  2. <p>Message is: {{ message }}</p>

點(diǎn)擊此處實(shí)現(xiàn)

#多行文本 (textarea)

  1. <span>Multiline message is:</span>
  2. <p style="white-space: pre-line;">{{ message }}</p>
  3. <br />
  4. <textarea v-model="message" placeholder="add multiple lines"></textarea>

點(diǎn)擊此處實(shí)現(xiàn)

在文本區(qū)域插值不起作用,應(yīng)該使用 v-model 來(lái)代替。

  1. <!-- bad -->
  2. <textarea>{{ text }}</textarea>
  3. <!-- good -->
  4. <textarea v-model="text"></textarea>

#復(fù)選框 (Checkbox)

單個(gè)復(fù)選框,綁定到布爾值:

  1. <input type="checkbox" id="checkbox" v-model="checked" />
  2. <label for="checkbox">{{ checked }}</label>

點(diǎn)擊此處實(shí)現(xiàn)

多個(gè)復(fù)選框,綁定到同一個(gè)數(shù)組:

  1. <div id="v-model-multiple-checkboxes">
  2. <input type="checkbox" id="jack" value="Jack" v-model="checkedNames" />
  3. <label for="jack">Jack</label>
  4. <input type="checkbox" id="john" value="John" v-model="checkedNames" />
  5. <label for="john">John</label>
  6. <input type="checkbox" id="mike" value="Mike" v-model="checkedNames" />
  7. <label for="mike">Mike</label>
  8. <br />
  9. <span>Checked names: {{ checkedNames }}</span>
  10. </div>

  1. Vue.createApp({
  2. data() {
  3. return {
  4. checkedNames: []
  5. }
  6. }
  7. }).mount('#v-model-multiple-checkboxes')

點(diǎn)擊此處實(shí)現(xiàn)

#單選框 (Radio)

  1. <div id="v-model-radiobutton">
  2. <input type="radio" id="one" value="One" v-model="picked" />
  3. <label for="one">One</label>
  4. <br />
  5. <input type="radio" id="two" value="Two" v-model="picked" />
  6. <label for="two">Two</label>
  7. <br />
  8. <span>Picked: {{ picked }}</span>
  9. </div>

  1. Vue.createApp({
  2. data() {
  3. return {
  4. picked: ''
  5. }
  6. }
  7. }).mount('#v-model-radiobutton')

點(diǎn)擊此處實(shí)現(xiàn)

#選擇框 (Select)

單選時(shí):

  1. <div id="v-model-select" class="demo">
  2. <select v-model="selected">
  3. <option disabled value="">Please select one</option>
  4. <option>A</option>
  5. <option>B</option>
  6. <option>C</option>
  7. </select>
  8. <span>Selected: {{ selected }}</span>
  9. </div>

  1. Vue.createApp({
  2. data() {
  3. return {
  4. selected: ''
  5. }
  6. }
  7. }).mount('#v-model-select')

點(diǎn)擊此處實(shí)現(xiàn)

Note

如果 v-model 表達(dá)式的初始值未能匹配任何選項(xiàng),<select> 元素將被渲染為“未選中”狀態(tài)。在 iOS 中,這會(huì)使用戶(hù)無(wú)法選擇第一個(gè)選項(xiàng)。因?yàn)檫@樣的情況下,iOS 不會(huì)觸發(fā) change 事件。因此,更推薦像上面這樣提供一個(gè)值為空的禁用選項(xiàng)。

多選時(shí) (綁定到一個(gè)數(shù)組):

  1. <select v-model="selected" multiple>
  2. <option>A</option>
  3. <option>B</option>
  4. <option>C</option>
  5. </select>
  6. <br />
  7. <span>Selected: {{ selected }}</span>

點(diǎn)擊此處實(shí)現(xiàn)

v-for 渲染的動(dòng)態(tài)選項(xiàng):

  1. <div id="v-model-select-dynamic" class="demo">
  2. <select v-model="selected">
  3. <option v-for="option in options" :value="option.value">
  4. {{ option.text }}
  5. </option>
  6. </select>
  7. <span>Selected: {{ selected }}</span>
  8. </div>

  1. Vue.createApp({
  2. data() {
  3. return {
  4. selected: 'A',
  5. options: [
  6. { text: 'One', value: 'A' },
  7. { text: 'Two', value: 'B' },
  8. { text: 'Three', value: 'C' }
  9. ]
  10. }
  11. }
  12. }).mount('#v-model-select-dynamic')

點(diǎn)擊此處實(shí)現(xiàn)

#值綁定

對(duì)于單選按鈕,復(fù)選框及選擇框的選項(xiàng),v-model 綁定的值通常是靜態(tài)字符串 (對(duì)于復(fù)選框也可以是布爾值):

  1. <!-- 當(dāng)選中時(shí),`picked` 為字符串 "a" -->
  2. <input type="radio" v-model="picked" value="a" />
  3. <!-- `toggle` 為 true 或 false -->
  4. <input type="checkbox" v-model="toggle" />
  5. <!-- 當(dāng)選中第一個(gè)選項(xiàng)時(shí),`selected` 為字符串 "abc" -->
  6. <select v-model="selected">
  7. <option value="abc">ABC</option>
  8. </select>

但是有時(shí)我們可能想把值綁定到當(dāng)前活動(dòng)實(shí)例的一個(gè)動(dòng)態(tài) property 上,這時(shí)可以用 v-bind 實(shí)現(xiàn),此外,使用 v-bind 可以將輸入值綁定到非字符串。

#復(fù)選框 (Checkbox)

  1. <input type="checkbox" v-model="toggle" true-value="yes" false-value="no" />

  1. // when checked:
  2. vm.toggle === 'yes'
  3. // when unchecked:
  4. vm.toggle === 'no'

Tip

這里的 true-valuefalse-value attribute 并不會(huì)影響輸入控件的 value attribute,因?yàn)闉g覽器在提交表單時(shí)并不會(huì)包含未被選中的復(fù)選框。如果要確保表單中這兩個(gè)值中的一個(gè)能夠被提交,(即“yes”或“no”),請(qǐng)換用單選按鈕。

#單選框 (Radio)

  1. <input type="radio" v-model="pick" v-bind:value="a" />

  1. // 當(dāng)選中時(shí)
  2. vm.pick === vm.a

#Select Options

  1. <select v-model="selected">
  2. <!-- 內(nèi)聯(lián)對(duì)象字面量 -->
  3. <option :value="{ number: 123 }">123</option>
  4. </select>

  1. // 當(dāng)被選中時(shí)
  2. typeof vm.selected // => 'object'
  3. vm.selected.number // => 123

#修飾符

#.lazy

在默認(rèn)情況下,v-model 在每次 input 事件觸發(fā)后將輸入框的值與數(shù)據(jù)進(jìn)行同步 (除了上述輸入法組織文字時(shí))。你可以添加 lazy 修飾符,從而轉(zhuǎn)為在 change 事件_之后_進(jìn)行同步:

  1. <!-- 在“change”時(shí)而非“input”時(shí)更新 -->
  2. <input v-model.lazy="msg" />

#.number

如果想自動(dòng)將用戶(hù)的輸入值轉(zhuǎn)為數(shù)值類(lèi)型,可以給 v-model 添加 number 修飾符:

  1. <input v-model.number="age" type="number" />

這通常很有用,因?yàn)榧词乖?type="number" 時(shí),HTML 輸入元素的值也總會(huì)返回字符串。如果這個(gè)值無(wú)法被 parseFloat() 解析,則會(huì)返回原始的值。

#.trim

如果要自動(dòng)過(guò)濾用戶(hù)輸入的首尾空白字符,可以給 v-model 添加 trim 修飾符:

  1. <input v-model.trim="msg" />

#在組件上使用 v-model

如果你還不熟悉 Vue 的組件,可以暫且跳過(guò)這里。

HTML 原生的輸入元素類(lèi)型并不總能滿(mǎn)足需求。幸好,Vue 的組件系統(tǒng)允許你創(chuàng)建具有完全自定義行為且可復(fù)用的輸入組件。這些輸入組件甚至可以和 v-model 一起使用!

要了解更多,請(qǐng)參閱組件指南中的自定義輸入組件。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)