Vue(10)表單輸入繫結v-model

Silent丿丶黑羽發表於2021-07-01

v-model

v-model指定可以實現表單值與屬性的雙向繫結。即表單元素中更改了值會自動的更新屬性中的值,屬性中的值更新了會自動更新表單中的值
 

繫結的屬性和事件

v-model在內部為不同的輸入元素使用不同的屬性並丟擲不同的事件:
1.texttextarea元素使用value屬性和input事件。
2.checkboxradio使用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繫結

最後我們檢視下繫結的效果,與繫結後的網頁原始碼

我們可以看到繫結後idvalue的值都是遍歷後的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">

相關文章