1 文本 最简单的 v-model
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Vue中的表单绑定</title>
<script src="../vue.js"></script>
</head>
<body>
<div id="root">
<!-- 和 value 变量进行双向绑定(即变化会互相影响)-->
<input v-model="value"/>
{{value}}
</div>
<script>
new Vue({
el: "#root",
data: {
value: ""
},
watch: {
value: function () {
console.log(typeof this.value)
}
}
})
</script>
</body>
</html>
输入啥,就打印啥:
不止是 input ,还可是其他标签。 v-model
指令在表单:
<input>
<textarea>
<select>
元素上创建双向数据绑定。它会根据控件类型,自动选取正确方法来更新元素。有点神奇,但本质不过是个语法糖。
它负责监听用户的输入事件以更新数据,并对一些极端场景特殊处理。
v-model
会忽略所有表单元素的 value
、checked
、selected
特性的初始值而总是将 Vue 实例的数据作为数据来源。你应该通过 JS 在组件的 data
选项中声明初始值。
对于需要使用输入法(如中文、日文、韩文等)的语言, v-model
不会在输入法组合文字过程中得到更新。若想处理这个过程,用 input
事件。
<script>
new Vue({
el: '#app',
data: {
message: '',
checked: false
}
})
</script>
2 多行文本
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Vue中的表单绑定</title>
<script src="../vue.js"></script>
</head>
<body>
<div id="root">
<!-- 和 value 变量进行双向绑定(即变化会互相影响)-->
<!-- <input v-model="value"/>-->
<textarea v-model="value" rows="10" cols="50"></textarea>
{{value}}
</div>
<script>
new Vue({
el: "#root",
data: {
value: ""
}
})
</script>
</body>
</html>
在文本区域插值 (<textarea></textarea>
) 并不会生效,应用 v-model
来代替。
3 复选框
3.1 单个复选框
绑定到布尔值:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Vue中的表单绑定</title>
<script src="../vue.js"></script>
</head>
<body>
<div id="root">
<input type="checkbox" v-model="value"></input>
{{value}}
</div>
<script>
new Vue({
el: "#root",
data: {
value: ""
}
})
</script>
</body>
</html>
效果:
3.2 多个复选框
绑定到同一个数组:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>TodoList</title>
<script src='vue.js'></script>
</head>
<body>
<div id='example-3'>
<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>
new Vue({
el: '#example-3',
data: {
checkedNames: []
}
})
</script>
</body>
</html>
效果:
4 单选框
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>TodoList</title>
<script src='vue.js'></script>
</head>
<body>
<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>
<script>
new Vue({
el: '#example-4',
data: {
picked: ''
}
})
</script>
</body>
</html>
5 选择框
单选时:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>TodoList</title>
<script src='vue.js'></script>
</head>
<body>
<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>
<script>
new Vue({
el: '#example-5',
data: {
selected: ''
}
})
</script>
</body>
</html>
若 v-model 表达式的初始值未能匹配任何选项,<select> 元素将被渲染为“未选中”状态。在 iOS 中,这会使用户无法选择第一个选项。因为这样的情况下,iOS 不会触发 change 事件。因此,推荐像该案例这样,提供一个值为空的禁用选项。
lazy 修饰符
现在希望提高性能,等失去焦点了再把内容完全输出:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Vue中的表单绑定</title>
<script src="../vue.js"></script>
</head>
<body>
<div id="root">
<input type="text" v-model.lazy="value"/>
{{value}}
</div>
<script>
new Vue({
el: "#root",
data: {
value: ""
}
})
</script>
</body>
</html>
number
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Vue中的表单绑定</title>
<script src="../vue.js"></script>
</head>
<body>
<div id="root">
<input type="text" v-model.number="value"/>
{{value}}
</div>
<script>
new Vue({
el: "#root",
data: {
value: ""
},
watch: {
value: function () {
console.log(typeof this.value)
}
}
})
</script>
</body>
</html>
输入是字符串时,类型判断没问题:
输入数值时,也能识别了:
trim
去除首尾空格:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Vue中的表单绑定</title>
<script src="../vue.js"></script>
</head>
<body>
<div id="root">
<input type="text" v-model.trim="value"/>
{{value}}
</div>
<script>
new Vue({
el: "#root",
data: {
value: ""
},
watch: {
value: function () {
console.log(typeof this.value)
}
}
})
</script>
</body>
</html>