0%

Vue.js Form Input Bindings 表單輸入綁定

使用 Vue 資料雙向綁定的特性,做表單資料的自動收集。

先去 codepen 看看:Vue.js Form Input Bindings 表單輸入綁定

通常在處理表單的時候,在填完表單時,通常以<from>標籤內的action屬性來傳送,但在 Vue 裡,可以先把<from>的預設submit動作取消,並以監聽的方式(v-on)處理:@submit.prevent(方法)。當我們按下送出表單鍵時,就會去執行handleSubmit這個方法,在方法裡在指定我們希望如何處理表單內的資料就可以了。

表單裡的標籤綁定

主要以v-model來做資料的雙向綁定,達到自動收集填入資料的目的。
表單裡有單純的輸入(text/textarea)、單選項(radio)、複選項(checkbox)和選單(select),實例中我們必須先在data裡初始化我們會用到的值,這些初始值則是對應到 HTML 表單標籤裡的value,例如,如果我們希望預設的radio選項是 female,在data裡的sex初始,給female就可以了,以此類推。

需要注意的是,因為複選項(checkbox)是可以複選,所以必須是陣列格式,才能複選。

另外,在選單(select)的部分,可以在實例的data中先把物件型態的陣列準備好,然後在 HTML 使用v-for迴圈的方式讀取選單裡的選項。需要注意的是,通常在資料庫裡,我們需要的會是這些屬性的id而非文字,所以物件型態的陣列可以給兩個屬性:city.namecity.id,找到id就可找到對應的城市名。
而這個選單(select)的初始值,也就是v-model綁定的cityId,在實例的data裡也須先初始化好。

如果我們希望使用者所輸入的資料是固定的某一資料型別,例如可以計算的number,那麼我們也可以在 HTML 標籤的屬性上指定 v-model 的資料型別,確保同步時使用者更動回來的是數字。例如:

1
2
<input v-model="productPrice" type="number" />
<p>商品價格:{{ productPrice }}</p>

HTML 的部分:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<div id="app">
<form action="xxx" @submit.prevent="handleSubmit">
<p><span>Name : </span><input type="text" v-model="name" /></p>
<p>
<span>Password : </span><input type="password" name="pwd" v-model="pwd" />
</p>
<p>
<span>Sex : </span>
<input type="radio" name="" id="female" value="female" v-model="sex" />
<label for="female">Femme</label>
<input type="radio" name="" id="male" value="male" v-model="sex" />
<label for="male">Home</label>
</p>
<p>
<span>Hobby : </span>
<input type="checkbox" value="travel" id="travel" v-model="hobbys" />
<label for="travel">Travel</label>
<input type="checkbox" value="cinema" id="cinema" v-model="hobbys" />
<label for="cinema">Cinema</label>
<input type="checkbox" value="food" id="food" v-model="hobbys" />
<label for="food">Food</label>
<input type="checkbox" value="sport" id="sport" v-model="hobbys" />
<label for="sport">Sport</label>
</p>
<p>
<span>City : </span>
<!-- 動態顯示 -->
<select name="city" v-model="cityId">
<option value="">No selection</option>
<!-- 如果直接寫value="city.id" 會被當成是字串,需加上冒號 :value="" 成為表達式 -->
<option :value="city.id" v-for="(city, index) in citys" :key="city.id">
{{city.name}}
</option>
</select>
</p>
<p>
<textarea
name="info"
cols="30"
rows="10"
placeholder="Self introduction"
v-model="info"
></textarea>
</p>
<p>
<input type="submit" value="register" />
</p>
</form>
</div>

Vue 實例的部分:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
const vm = new Vue({
el: '#app',
data: {
name: '',
pwd: '',
sex: 'female', // 預設值是從 value 抓來的
hobbys: ['travel'],
citys: [
{
id: 1,
name: 'Paris',
},
{
id: 2,
name: 'Taipei',
},
{
id: 3,
name: 'London',
},
{
id: 4,
name: 'Tainan',
},
],
cityId: '2',
info: '',
},
methods: {
handleSubmit() {
console.log(
this.name,
this.pwd,
this.sex,
this.hobbys,
this.cityId,
this.info
);
},
},
});