1、基本用法
Vue 提供了 v-model 指令,用于在表单类元素上双向绑定数据,例如在输入框上使用时,输入的内容会实时映射到绑定的数据上。例如下面的例子:
<template>
<div id="app">
<input type="text" v-model="message" placeholder="输入">
<p>输入的内容是:{{ message }}</p>
</div>
</template>
<script>
export default {
name: "App",
data() {
return {
message: ''
}
}
};
</script>
在输入框输入的同时,{{ message }} 也会实时将内容渲染在视图中:

对于文本域 textarea 也是同样的用法:
<template>
<div id="app">
<textarea v-model="text" placeholder="输入..."></textarea>
<p>输入的内容是:</p>
<p style="white-space: pre">{{ text }}</p>
</div>
</template>
<script>
export default {
name: "App",
data() {
return {
text: ''
}
}
};
</script>

2、单选按钮
(1)单选按钮在单独使用时,不需要 v-model ,直接使用 v-bind 绑定一个布尔类型的值, 为真时选中, 为否时不选,例如:
<template>
<div id="app">
<input type="radio" :checked="picked">
<label>单选按钮</label>
</div>
</template>
<script>
export default {
name: "App",
data() {
return {
picked: true
}
}
};
</script>
(2)如果是组合使用来实现互斥选择的效果,就需要 v-model 配合 value 来使用:
<template>
<div id="app">
<input type="radio" v-model="picked" value="html" id="html">
<label for="html">HTML</label>
<br>
<input type="radio" v-model="picked" value="js" id="js">
<label for="js">JavaScript</label>
<br>
<input type="radio" v-model="picked" value="css" id="css">
<label for="js">CSS</label>
<br>
<p>选择的项是:{{ picked }}</p>
</div>
</template>
<script>
export default {
name: "App",
data() {
return {
picked: 'js'
}
}
};
</script>

3、复选框
(1)复选框单独使用时,也是用 v-model 来绑定一个布尔值:
<template>
<div id="app">
<input type="checkbox" v-model="checked" id="checked">
<label for="checked">选择状态:{{ checked }}</label>
</div>
</template>
<script>
export default {
name: "App",
data() {
return {
checked: false
}
}
};
</script>
(2)复选框组合使用时,也是 v-model 与 value 一起,多个勾选框都绑定到同一个数组类型的数据, value 的值在数组当中,就会选中这一项。这一过程也是双向的,在勾选时, value 的值也会自动 push 到这个数组中,示例代码如下:
<template>
<div id="app">
<input type="checkbox" v-model="checked" value="html" id="html">
<label for="html">HTML</label>
<br>
<input type="checkbox" v-model="checked" value="js" id="js">
<label for="js">JavaScript</label>
<br>
<input type="checkbox" v-model="checked" value="css" id="css">
<label for="css">CSS</label>
<br>
<p>选择的项是:{{ checked }}</p>
</div>
</template>
<script>
export default {
name: "App",
data() {
return {
checked: ['html', 'css']
}
}
};
</script>

4、下拉列表框
(1)单选方式:
<template>
<div id="app">
<select v-model="selected">
<option>html</option>
<option value="js">JavaScript</option>
<option>css</option>
</select>
<p>选择的项是:{{ selected }}</p>
</div>
</template>
<script>
export default {
name: "App",
data() {
return {
selected: 'html'
}
}
};
</script>

<template>
<div id="app">
<select v-model="selected" multiple>
<option>html</option>
<option value="js">JavaScript</option>
<option>css</option>
</select>
<p>选择的项是:{{ selected }}</p>
</div>
</template>
<script>
export default {
name: "App",
data() {
return {
selected: ['html', 'js']
}
}
};
</script>

<template>
<div id="app">
<select v-model="selected">
<option v-for="option in options" :value="option.value">{{ option.text }}</option>
</select>
<p>选择的项是:{{ selected }}</p>
</div>
</template>
<script>
export default {
name: "App",
data() {
return {
selected: 'html',
options: [
{
text: 'HTML',
value: 'html'
},
{
text: 'JavaScript',
value: 'js'
},
{
text: 'CSS',
value: 'css'
}
]
}
}
};
</script>
5、绑定值
以上示例 v-model 绑定的值是一个静态字符串或布尔值,但在业务中,有时需要绑定一个动态的数据,这时可以用 v-bind 实现。
(1)单选按钮:
<template>
<div id="app">
<input type="radio" v-model="picked" :value="value">
<label>单选按钮</label>
<p>{{ picked }}</p>
<p>{{ value }}</p>
</div>
</template>
<script>
export default {
name: "App",
data() {
return {
picked: false,
value: 123
}
}
};
</script>

在选中时 app.picked === app.value,值都是 123。
(2)复选框:
<template>
<div id="app">
<input type="checkbox" v-model="toggle" :true-value="value1" :false-value="value2">
<label>复选狂</label>
<p>{{ toggle }}</p>
<p>{{ value1 }}</p>
<p>{{ value2 }}</p>
</div>
</template>
<script>
export default {
name: "App",
data() {
return {
toggle: false,
value1: 'a',
value2: 'b'
}
}
};
</script>

勾选时,app.toggle === app.value1;未勾选时,app.toggle === app.value2。
6、v-model 的修饰符:
在输入框中,v-model 默认是在 input 事件中同步输入框的数据(除了提示中介绍的中文输入法情况外),使用修饰符 .lazy 会转变为在change 事件中同步,示例代码如下:
<template>
<div id="app">
<input type="text" v-model.lazy="message">
<p>{{ message }}</p>
</div>
</template>
<script>
export default {
name: "App",
data() {
return {
message: ''
}
}
};
</script>
这时, message 并不是实时改变的,而是在失焦或按回车时才更新。
参考:
《Vue.js实战》