10 VUE基础:表单输入
可以用v-model
指令在表单 <input>
、<textarea>
及 <select>
元素上创建双向数据绑定,v-model
会根据控件类型自动选取正确的方法来更新元素。v-model
主要负责监听用户的输入事件以更新数据,并对一些极端场景进行一些特殊处理。
v-model
会忽略所有表单元素的 value
、checked
、selected
等属性的初始值而总是将Vue
实例的数据作为数据来源,所以需要通过JavaScript在组件的data
选项中声明初始值。
v-model
在内部为不同的输入元素使用不同的属性并抛出不同的事件:
text
和textarea
元素使用value
属性和input
事件;checkbox
和radio
使用checked
属性和change
事件;select
字段将value
作为prop
并将change
作为事件。
10.1 控件示例
文本控件:
<span>用户名: </span>
<input type="text" v-model="username" placeholder="用户名"><br>
密码控件:
<span>密码: </span>
<input type="password" v-model="pwd" placeholder="密码"><br>
单选按钮:
<span>性别: </span>
<input type="radio" id="female" value="女" v-model="sex"><label for="female">女</label>
<input type="radio" id="male" value="男" v-model="sex"><label for="male">男</label><br>
复选按钮:
<span>爱好: </span>
<input type="checkbox" id="basket" value="basket" v-model="likes"><label for="basket">篮球</label>
<input type="checkbox" id="foot" value="foot" v-model="likes"><label for="foot">足球</label>
<input type="checkbox" id="pingpang" value="pingpang" v-model="likes"><label for="pingpang">乒乓</label><br>
下拉框:
<span>工作意愿城市: </span>
<select v-model="cityId">
<option value="">未选择</option>
<option :value="city.id" v-for="(city, index) in allCitys" :key="city.id">{{city.name}}</option>
</select><br>
多行文本:
<span>个人介绍: </span>
<textarea rows="10" v-model="personinfo"></textarea><br><br>
10.2 修饰符
[.lazy
]:在默认情况下,v-model
在每次 input
事件触发后将输入框的值与数据进行同步,可以添加 lazy
修饰符,从而转为在 change
事件之后进行同步。
<!-- 在“change”时而非“input”时更新 -->
<input v-model.lazy="msg">
[.number
]:自动将用户的输入值转为数值类型,可以给 v-model
添加 number
修饰符。
<input v-model.number="age" type="number">
这通常很有用,因为即使在 type="number"
时,HTML输入元素的值也总会返回字符串。如果这个值无法被 parseFloat()
解析,则会返回原始的值。
[.trim
]:如果要自动过滤用户输入的首尾空白字符,可以给 v-model
添加 trim
修饰符:
<input v-model.trim="msg">
10.3 示例代码
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>VUE之表单绑定</title>
</head>
<body>
<div id="app">
<form action="/xxx" @submit.prevent="handleSubmit">
<span>用户名: </span>
<input type="text" v-model="username" placeholder="用户名"><br>
<span>密码: </span>
<input type="password" v-model="pwd" placeholder="密码"><br>
<span>性别: </span>
<input type="radio" id="female" value="女" v-model="sex"><label for="female">女</label>
<input type="radio" id="male" value="男" v-model="sex"><label for="male">男</label><br>
<span>爱好: </span>
<input type="checkbox" id="basket" value="basket" v-model="likes"><label for="basket">篮球</label>
<input type="checkbox" id="foot" value="foot" v-model="likes"><label for="foot">足球</label>
<input type="checkbox" id="pingpang" value="pingpang" v-model="likes"><label for="pingpang">乒乓</label><br>
<span>工作意愿城市: </span>
<select v-model="cityId">
<option value="">未选择</option>
<option :value="city.id" v-for="(city, index) in allCitys" :key="city.id">{{city.name}}</option>
</select><br>
<span>个人介绍: </span>
<textarea rows="10" v-model="personinfo"></textarea><br><br>
<input type="submit" value="确认">
</form>
</div>
</body>
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script type="text/javascript">
const vm = new Vue({
el: "#app",
data: {
username: '',
pwd: '',
sex: '男',
likes: ['foot'],
allCitys: [{id: 1, name: '北京'}, {id: 2, name: '上海'}, {id: 3, name: '广州'}],
cityId: '2',
personinfo: '毕业于XX大学'
},
methods: {
handleSubmit(){
console.log(this.username);
console.log(this.sex);
}
}
})
</script>
</html>