Vue學習筆記之表單繫結
阿新 • • 發佈:2022-03-17
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>
實現效果: