1. 程式人生 > 其它 >Vue學習筆記之表單繫結

Vue學習筆記之表單繫結

1. 概述

1.1. 什麼是資料的雙向繫結

Vue.js是一個MV VM框架, 即資料雙向繫結, 即當資料發生變化的時候, 檢視也就發生變化, 當檢視發生變化的時候,資料也會跟著同步變化。這也算是Vue.js的精髓之處了。   值得注意的是,我們所說的資料雙向繫結,一定是對於UI控制元件來說的非UI控制元件不會涉及到資料雙向繫結。單向資料繫結是使用狀態管理工具的前提。如果我們使用vue x那麼資料流也是單項的,這時就會和雙向資料繫結有衝突。

1.2. 為什麼要實現資料的雙向繫結

在Vue.js中,如果使用vuex, 實際上資料還是單向的, 之所以說是資料雙向繫結,這是用的UI控制元件來說, 對於我們處理表單, Vue.js的雙向資料繫結用起來就特別舒服了。即兩者並不互斥,在全域性性資料流使用單項,方便跟蹤;區域性性資料流使用雙向,簡單易操作。

2. 在表單中使用雙向資料繫結

你可以用v-model指令在表單、及元素上建立雙向資料繫結。它會根據控制元件型別自動選取正確的方法來更新元素。儘管有些神奇, 但v-model本質上不過是語法糖。它負責監聽使用者的輸入事件以更新資料,並對一些極端場景進行一些特殊處理。   注意:v-model會忽略所有表單元素的value、checked、selected特性的初始值而總是將Vue例項的資料作為資料來源。你應該通過JavaScript在元件的data選項中宣告初始值

2.1. 單行文字

主要程式碼:

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

完整程式碼:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>表單繫結</title>
		<!-- 開發環境版本,包含了有幫助的命令列警告 -->
		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
	</head>
	<body>
		<div id="app">
			<input v-model="message" placeholder="edit me">
			<p>Message is: {{ message }}</p>
		</div>
		<script type="text/javascript">
			var app = new Vue({
				el:"#app",
				data:{
					message:''
				}
				
			})
		</script>
	</body>
</html>

實現效果:

2.2. 多行文字

主要程式碼:

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

完整程式碼:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>表單繫結</title>
		<!-- 開發環境版本,包含了有幫助的命令列警告 -->
		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
	</head>
	<body>
		<div id="app">
			<span>Multiline message is:</span>
			<p style="white-space: pre-line;">{{ message }}</p>
			<br>
			<textarea v-model="message" placeholder="add multiple lines"></textarea>
		</div>
		<script type="text/javascript">
			var app = new Vue({
				el: "#app",
				data: {
					message: ''
				}

			})
		</script>
	</body>
</html>

實現效果:

2.3. 單複選框

主要程式碼:

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

完整程式碼:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>表單繫結</title>
		<!-- 開發環境版本,包含了有幫助的命令列警告 -->
		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
	</head>
	<body>
		<div id="app">
			<input type="checkbox" id="checkbox" v-model="checked">
			<label for="checkbox">{{ checked }}</label>
		</div>
		<script type="text/javascript">
			var app = new Vue({
				el: "#app",
				data: {
					checked: false
				}

			})
		</script>
	</body>
</html>

實現效果:

2.4. 多複選框

多個複選框,繫結到同一個陣列:
主要程式碼:

<input type="checkbox" id="jack" value="Jack" v-model="checkedNames">
<label for="jack">Jack</label>
<input type="checkbox" id="john" value="John" v-model="checkedNames">
<label for="john">John</label>
<input type="checkbox" id="mike" value="Mike" v-model="checkedNames">
<label for="mike">Mike</label>
<br>
<span>Checked names: {{ checkedNames }}</span>

完整程式碼:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>表單繫結</title>
		<!-- 開發環境版本,包含了有幫助的命令列警告 -->
		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
	</head>
	<body>
		<div id="app">
			<input type="checkbox" id="jack" value="Jack" v-model="checkedNames">
			<label for="jack">Jack</label>
			<input type="checkbox" id="john" value="John" v-model="checkedNames">
			<label for="john">John</label>
			<input type="checkbox" id="mike" value="Mike" v-model="checkedNames">
			<label for="mike">Mike</label>
			<br>
			<span>Checked names: {{ checkedNames }}</span>
		</div>
		<script type="text/javascript">
			var app = new Vue({
				el: "#app",
				data: {
					checkedNames: []
				}

			})
		</script>
	</body>
</html>

實現效果:

2.5. 單選按鈕

主要程式碼:

<div id="example-4">
  <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>

完整程式碼:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>表單繫結</title>
		<!-- 開發環境版本,包含了有幫助的命令列警告 -->
		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
	</head>
	<body>
		<div id="app">
			<div id="example-4">
				<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>
		</div>
		<script type="text/javascript">
			var app = new Vue({
				el: "#app",
				data: {
					picked: ''
				}

			})
		</script>
	</body>
</html>

實現效果:

2.6. 下拉框

主要程式碼:

<div id="example-5">
  <select v-model="selected">
    <option disabled value="">請選擇</option>
    <option>A</option>
    <option>B</option>
    <option>C</option>
  </select>
  <span>Selected: {{ selected }}</span>
</div>

完整程式碼:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>表單繫結</title>
		<!-- 開發環境版本,包含了有幫助的命令列警告 -->
		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
	</head>
	<body>
		<div id="app">
			<div id="example-5">
				<select v-model="selected">
					<option disabled value="">請選擇</option>
					<option>A</option>
					<option>B</option>
					<option>C</option>
				</select>
				<span>Selected: {{ selected }}</span>
			</div>
		</div>
		<script type="text/javascript">
			var app = new Vue({
				el: "#app",
				data: {
					selected: ''
				}

			})
		</script>
	</body>
</html>

實現效果:

2.7. 多選框

主要程式碼:

<div id="example-6">
  <select v-model="selected" multiple style="width: 50px;">
    <option>A</option>
    <option>B</option>
    <option>C</option>
  </select>
  <br>
  <span>Selected: {{ selected }}</span>
</div>

完整程式碼:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>表單繫結</title>
		<!-- 開發環境版本,包含了有幫助的命令列警告 -->
		<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
	</head>
	<body>
		<div id="app">
			<div id="example-6">
				<select v-model="selected" multiple style="width: 50px;">
					<option>A</option>
					<option>B</option>
					<option>C</option>
				</select>
				<br>
				<span>Selected: {{ selected }}</span>
			</div>
		</div>
		<script type="text/javascript">
			var app = new Vue({
				el: "#app",
				data: {
					selected: []
				}

			})
		</script>
	</body>
</html>

實現效果:

3. 參考資料

[1]表單輸入繫結 — Vue.js 中文文件

[2]Vue課堂筆記/04表單雙綁、元件.md · 盧澤華/Vue - 碼雲 - 開源中國