一塊兒學Vue之表單輸入綁定

在Vue進行前端開發中,表單的輸入是基礎且常見的功能,本文以一個簡單的小例子,簡述v-model數據綁定的用法,僅供學習分享使用,若有不足,還請指正。javascript

基礎用法

你能夠用 v-model 指令在表單 <input>、<textarea> 及 <select> 元素上建立雙向數據綁定。它會根據控件類型自動選取正確的方法來更新元素。儘管有些神奇,但 v-model 本質上不過是語法糖。它負責監聽用戶的輸入事件以更新數據,並對一些極端場景進行一些特殊處理。v-model 會忽略全部表單元素的 value、checked、selected attribute 的初始值而老是將 Vue 實例的數據做爲數據來源。你應該經過 JavaScript 在組件的 data 選項中聲明初始值。v-model 在內部爲不一樣的輸入元素使用不一樣的屬性並拋出不一樣的事件,以下所示:前端

  • text 和 textarea 元素使用 value 屬性和 input 事件;
  • checkbox 和 radio 使用 checked 屬性和 change 事件;
  • select 字段將 value 做爲 prop 並將 change 做爲事件。

文本

經過v-model將input的value值和msg進行雙向綁定,以下所示:java

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

多行文本

經過v-model將textarea的value值和msg進行雙向綁定,以下所示:數組

1 <span>多行信息以下:</span>
2 <p style="white-space: pre-line;">{{ msg }}</p>
3 <textarea v-model="msg" placeholder="add multiple lines"></textarea>

注意:white-space: pre-line;表示:合併空白符序列,可是保留換行符。瀏覽器

在文本區域插值 (<textarea>{{text}}</textarea>) 並不會生效,應用 v-model 來代替。app

複選框

單個複選框,綁定到布爾值,以下所示:ide

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

注意:for="checkbox" 表示將label和input進行綁定。v-model="checked"中的checked爲定義的屬性。學習

多個複選框,綁定到同一個數組:spa

 1 <div id='example-3'>
 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>選種名稱: {{ checkedNames }}</span>
10 </div>

單選按鈕

v-model="picked" 表示將單選 按鈕的選種的項的value值綁定到picked雙向綁定

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

下拉選擇框

單選時,將選種項的值和selected綁定,以下所示:

1 <select v-model="selected">
2     <option disabled value="">請選擇</option>
3     <option>A</option>
4     <option>B</option>
5     <option>C</option>
6 </select>
7 <span>Selected: {{ selected }}</span>

若是 v-model 表達式的初始值未能匹配任何選項,<select> 元素將被渲染爲「未選中」狀態。在 iOS 中,這會使用戶沒法選擇第一個選項。由於這樣的狀況下,iOS 不會觸發 change 事件。所以,更推薦像上面這樣提供一個值爲空的禁用選項。

多選時 (綁定到一個數組),以下所示:

1 <select v-model="selected1" multiple style="width: 50px;">
2     <option>A</option>
3     <option>B</option>
4     <option>C</option>
5 </select>
6 <br>
7 <span>Selected: {{ selected1 }}</span>

用 v-for 渲染的動態選項:

1 <select v-model="selected">
2     <option v-for="option in options" v-bind:value="option.value">
3     {{ option.text }}
4     </option>
5 </select>
6 <span>Selected: {{ selected }}</span>

值綁定

對於單選按鈕,複選框及選擇框的選項,v-model 綁定的值一般是靜態字符串 (對於複選框也能夠是布爾值):

1  <!-- 當選中時,`picked` 爲字符串 "a" -->
2 <input type="radio" v-model="picked" value="a">
3 <!-- `toggle` 爲 true 或 false -->
4 <input type="checkbox" v-model="toggle">
5 <!-- 當選中第一個選項時,`selected` 爲字符串 "abc" -->
6 <select v-model="selected">
7     <option value="abc">ABC</option>
8 </select>

可是有時咱們可能想把值綁定到 Vue 實例的一個動態屬性上,這時能夠用 v-bind 實現,而且這個屬性的值能夠不是字符串。

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

// 當選中時 vm.toggle === 'yes' // 當沒有選中時 vm.toggle === 'no'

這裏的 true-value 和 false-value attribute 並不會影響輸入控件的 value attribute,由於瀏覽器在提交表單時並不會包含未被選中的複選框。若是要確保表單中這兩個值中的一個可以被提交,(好比「yes」或「no」),請換用單選按鈕。

1 <input type="radio" v-model="picked" v-bind:value="a">

當選中時 vm.pick === vm.a

1 <select v-model="selected">
2     <!-- 內聯對象字面量 -->
3     <option v-bind:value="{ number: 123 }">123</option>
4 </select>

// 當選中時 typeof vm.selected // => 'object'  vm.selected.number // => 123

修飾符

在默認狀況下,v-model 在每次 input 事件觸發後將輸入框的值與數據進行同步 (除了上述輸入法組合文字時)。你能夠添加 lazy 修飾符,從而轉變爲使用 change 事件進行同步:

1 <!-- 在「change」時而非「input」時更新 -->
2 <input v-model.lazy="msg" type="text">

若是想自動將用戶的輸入值轉爲數值類型,能夠給 v-model 添加 number 修飾符:

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

這一般頗有用,由於即便在 type="number" 時,HTML 輸入元素的值也總會返回字符串。若是這個值沒法被 parseFloat() 解析,則會返回原始的值。

若是要自動過濾用戶輸入的首尾空白字符,能夠給 v-model 添加 trim 修飾符:

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

關於示例中用到的變量,以下所示:

 1 <script type="text/javascript">
 2     var app = new Vue({
 3         el: '#app',
 4         data: {
 5             msg: 'hello world!!!',
 6             checked:true,
 7             checkedNames: [],
 8             picked: '',
 9             a:"hello",
10             selected: '',
11             selected1: [],
12             toggle:false,
13             age:0,
14             options: [
15                 { text: 'One', value: 'A' },
16                 { text: 'Two', value: 'B' },
17                 { text: 'Three', value: 'C' }
18             ]
19         },
20     });
21 </script>
View Code

備註

一簫一劍生平意,負盡狂名十五年。

相關文章
相關標籤/搜索