1. 程式人生 > 其它 >表單輸入繫結

表單輸入繫結

表單輸入繫結

單行文字輸入框

<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
		<div id = "app">
			<input type="text" v-model="message" value="Hello Vue.js">
			<p>message:{{message}}</p>
		</div>
	
		<script src="https://unpkg.com/vue@next"></script>
        <script>
        	const vm = Vue.createApp({
        	    data() {
        	        return {
        	            message: 'Java無難事'
        	        }
        	    }
            }).mount('#app');
        </script>
	</body>
</html>

在input元素中使用value屬性設定了一個初始值"Hello Vue.js",用v-model指令綁定了一個表示式message,對應的資料屬性是message。

從圖中可以看出文字輸入框顯示的是資料屬性message的值,而不是value屬性的值。這是因為v-model指令會忽略所有表單元素的value、checked、selected屬性的初始值,而總是將當前活動例項的資料屬性作為資料來源。所以我們應該在js指令碼中或是在元件的data選項中宣告初始值。

v-model提供了一個trim修飾符,可以自動過濾輸入資料首尾的空白字元。

v-model還有.lazy修飾符。預設情況下v-model在每次input事件觸發後將輸入框的值與資料進行同步,如果使用了該修飾符則會轉變為使用change事件進行同步。

如果想自動將使用者輸入的資料轉換為數值型別,可以給v-model加number修飾符。

多行文字輸入框

<textarea v-model="message"></textarea>

複選框

複選框單獨使用時,v-model繫結的是布林值,多個一起使用時繫結的是同一個陣列,選中的複選框的值將被儲存到陣列中。

<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
		<div id = "app">
			<h3>單個複選框:</h3>
			<input id="agreement" type="checkbox" v-model="isAgree">
			<label for="agreement">{{ isAgree }}</label>
			
			<h3>多個複選框:</h3>
			<input id="basketball" type="checkbox" value="籃球" v-model="interests">
		    <label for="basketball">籃球</label>
		    <input id="football" type="checkbox" value="足球" v-model="interests">
		    <label for="football">足球</label>
		    <input id="volleyball" type="checkbox"  value="排球" v-model="interests">
		    <label for="volleyball">排球</label>
		    <input id="swim" type="checkbox"  value="游泳" v-model="interests">
		    <label for="swim">游泳</label>
		  
		    <p>你的興趣愛好是: {{ interests }}</p>
		</div>
	
		<script src="https://unpkg.com/vue@next"></script>
		<script>
			const vm = Vue.createApp({
    		    data() {
    		        return {
    		            isAgree: false,
    		            interests: []
    		        }
    		    }
		    }).mount('#app');
		</script>
	</body>
</html>

對於這種一組複選框一起使用的場景,可以考慮將變化的部分抽取出來放到元件例項的data中,定義為一個物件或陣列,然後通過v-for指令迴圈渲染輸出。

單選按鈕

當單選按鈕被選中時,v-model指令所繫結的資料屬性的值會被設定為該單選按鈕的value值 。

<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
		<div id = "app">
			<input id="male" type="radio" value="1" v-model="gender">
			<label for="male">男</label>
			<br>
			<input id="female" type="radio" value="0" v-model="gender">
			<label for="female">女</label>
			<br>
			<span>性別:{{ gender }}</span>
		</div>
	
		<script src="https://unpkg.com/vue@next"></script>
        <script>
        	const vm = Vue.createApp({
        	    data() {
        	        return {
        	            gender: ''
        	        }
        	    }
            }).mount('#app');
        </script>
	</body>
</html>

當選中男或女,gender的值會變為1或0;對於單選按鈕,v-model監聽的是change事件。

選擇框

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
		<div id = "app">
			<h3>單選選擇框</h3>
			<select v-model="education">
				<option disabled value="">請選擇您的學歷</option>
				<option>高中</option>
				<option>本科</option>
				<option>碩士</option>
				<option>博士</option>
			</select>
			<p>您的學歷是:{{ education }}</p>
			<h3>多選選擇框</h3>
			<select v-model="searches" multiple>
				<option v-for="option in options" :value="option.value">
					{{ option.text }}
				</option>
			</select>
			<p>您選擇的搜尋引擎是:{{ searches }}</p>
		</div>
	
		<script src="https://unpkg.com/vue@next"></script>
        <script>
        	const vm = Vue.createApp({
        	    data() {
        	        return {
        	            education: '',
        		     	searches: [],
        		     	options: [
        		     		{text: '百度', value: 'baidu.com'},
        		     		{text: '谷歌', value: 'google.com'},
        		     		{text: '必應', value: 'bing.com'}
        		     	]
        	        }
        	    }
            }).mount('#app');
        </script>
	</body>
</html>

值繫結

複選框

在使用某個複選框時,在input元素上可以使用兩個特殊的屬性true-value和false-value來指定選中狀態和未選中狀態下v-model繫結的值是什麼。

<div id="app">
    <input id="agreement" type="checkbox" v-model="isAgree" true-value="yes" false-value="no">
    <label for="agreement">{{ isAgree }}</label>
</div>

<script>
	const vm = Vue.createApp({
        data(){
            return {
                isAgree:false
            }
        }
    }).mount('#app');
</script>

isAgree初始值為false,當選中複選框時,其值為true-value的值,之後再取消複選框,其值為false-value的值。

這兩個屬性還可以使用v-bind繫結到資料屬性上:

<div id="app">
    <input id="agreement" type="checkbox" v-model="isAgree" :true-value="trueVal" :false-value="falseVal">
    <label for="agreement">{{ isAgree }}</label>
</div>

<script>
	const vm = Vue.createApp({
        data(){
            return {
                isAgree:false,
                trueVal:'真',
                falseVal:'假'
            }
        }
    }).mount('#app');
</script>

單選按鈕

單選按鈕被選中時,v-model繫結的資料屬性的預設值為該單選按鈕的value值,可以將value屬性繫結到另一個屬性:

<div id="app">
    <input id="male" type="radio" v-model="gender" :value="genderVal[0]">
    <label for="male">男</label><br>
    <input id="female" type="radio" v-model="gender" :value="genderVal[1]">
    <label for="female">女</label><br>
    <span>性別:{{ gender }}</span>
</div>

<script>
	const vm = Vue.createApp({
        data(){
            return {
                gender:'',
                fenderVal:['帥哥','美女']
            }
        }
    }).mount('#app');
</script>

選擇框的選項

通過選擇框選擇內容後,其值是選項的值(option元素的value屬性的值),選項的value屬性也可以使用v-bind指令繫結到一個數據屬性上。

<option v-for="option in options" :value="option.value"></option>

例項:使用者註冊

在單頁應用程式程式中,使用者註冊在提交時使用AJAX傳送資料到服務端,資料格式採用JSON格式,在表單提交前,通常使將要傳送的資料先組織為一個js物件或陣列,然後轉換為JSON字串進行傳送。可以使用v-model指令將輸入控制元件直接繫結到某個物件的屬性上,然後用v-on繫結提交按鈕的click事件,在事件處理函式中直接傳送該物件即可。

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>使用者註冊</title>
	</head>

	<body>
		<div id = "app">
		<form>
			<table border="0">
				<tr>
					<td>使用者名稱:</td>
					<td>
						<input type="text" name="username" v-model="user.username">
					</td>
				</tr>
				<tr>
					<td>密碼:</td>
					<td>
						<input type="password" name="password" v-model="user.password">
					</td>
				</tr>
				<tr>
					<td>性別:</td>
					<td>
						<input type="radio" name="gender" value="1" v-model="user.gender">男
						<input type="radio" name="gender" value="0" v-model="user.gender">女
					</td>
				</tr>
				<tr>
					<td>郵件地址:</td>
					<td>
						<input type="text" name="email" v-model="user.email">
					</td>
				</tr>
				<tr>
					<td>密碼問題:</td>
					<td>
						<input type="text" name="pwdQuestion" v-model="user.pwdQuestion">
					</td>
				</tr>
				<tr>
					<td>密碼答案:</td>
					<td>
						<input type="text" name="pwdAnswer" v-model="user.pwdAnswer">
					</td>
				</tr>
				<tr>
					<td>
						<input type="submit" value="註冊" @click.prevent="register">
					</td>
					<td><input type="reset" value="重填"></td>
				</tr>
			</table>
		</form>
	  </div>
	
        <script src="https://unpkg.com/vue@next"></script>
        <script>
        	const vm = Vue.createApp({
        	    data() {
        	        return {
        		        user: {
        		     		username: '',
        		     		password: '',
        		     		gender: '',
        		     		email: '',
        		     		pwdQuestion: '',
        		     		pwdAnswer: ''
        	     	    }
        	        }
        	    },
        	    methods: {
        	    	register: function(){
        	    		//直接傳送this.user物件
        	    		//...
        	    		console.log(this.user);
        	    	}
        	    }
            }).mount('#app');
        </script>
	</body>
</html>

在提交按鈕上繫結click事件時用了prevent修飾符,這是因為本例項是在click事件響應函式中完成的使用者註冊資料的傳送,並不希望表單的預設行為發生。