Vue 通过v-model="数据源"
指令实现数据的双向绑定,这其实是一种语法糖。该指令适用于表单元素和组件。
<input :value="text" @input="event => text = event.target.value">
<!-- v-model 指令帮我们简化了这一步骤 -->
<input v-model="text">
当你在表单元素上使用v-model
指令的时候,他会忽略表单元素上的value
、checked
、selected
属性。v-model
还可以用于各种不同类型的输入,例如:<textarea>
、<select>
元素。
它会根据所使用的元素自动使用对应的 DOM 属性和事件组合:
- 文本类型的
<input>
和<textarea>
元素会绑定 value property 并侦听 input 事件; **<input type="checkbox">**
和**<input type="radio">**
会绑定 checked property 并侦听 change 事件(注意和输入类型的表单进行区分);<select>
会绑定 value property 并侦听 change 事件。
基本用法
表单文本
<input type="text" v-model="innerText" />
多行文本
<textarea v-model="message" placeholder="请输入"></textarea>
:::warning
⚠️ 注意
注意在<textarea>
中是不支持插值表达式的,例如:<textarea>{{ text }}</textarea>
。
:::
复选框
<input type="checkbox" v-model="cbChecked" />
v-model
是以下内容的语法糖:
<input type="checkbox" :checked="cbChecked" @change="e => cbChecked = e.target.checked" />
checkbox 还可以用来勾选一组数据,它们都需要绑定同一个数据源数组:
<template>
<p>
<p>{{ selectedCountries }}</p>
<p>中国<input type="checkbox" value="China" v-model="selectedCountries" /></p>
<p>俄罗斯:<input type="checkbox" value="Russia" v-model="selectedCountries" /></p>
<p>美国:<input type="checkbox" value="America" v-model="selectedCountries" /></p>
</p>
</template>
单选框
**v-model**
应用在 radio 上的时候,需要绑定同一个数据源:
<template>
<p>
<p>{{ gender }}</p>
<p>男<input type="radio" value="male" v-model="gender" /></p>
<p>女<input type="radio" value="female" v-model="gender" /></p>
</p>
</template>
选择框
<select v-model="selectedValue">
<!-- 如果未能匹配到对应的 value,那么页面就会显示空项,IOS 中时无法触发 change 事件的,用户时没办法选择第一项,所以需要给一个空的占位 -->
<option disabled value="">请选择</option>
<option value="zhangsan">张三</option>
<option value="lisi">李四</option>
</select>
<!-- v-model 是一下内容的语法糖 -->
v-model
是以下内容的语法糖:
<select :value="selectedValue" @change="e => selectedValue = e.target.value">
<option disabled value="">请选择</option>
<option value="zhangsan">张三</option>
<option value="lisi">李四</option>
</select>
值绑定
对于单选按钮,复选框和选择器选项,v-model
绑定的值通常是静态的字符串 (或者对复选框是布尔值):
<!-- `picked` 在被选择时是字符串 "a" -->
<input type="radio" v-model="picked" value="a" />
<!-- `toggle` 只会为 true 或 false -->
<input type="checkbox" v-model="toggle" />
<!-- `selected` 在第一项被选中时为字符串 "abc" -->
<select v-model="selected">
<option value="abc">ABC</option>
</select>
Vue 容许我们传递自定义的数据绑定为其他的值。
例如在 checkbox 中通过true-value
和false-value
来绑定在勾选和非勾选情况下的值。
<input type="checkbox" v-model="toggle" true-value="yes" false-value="no" />
例如 radio 通过value
属性「动态」绑定选中时候的值:
const app = {
template: `
<p>
{{pick}}
<input type="radio" v-model="pick" :value="first" />
<input type="radio" v-model="pick" :value="second" />
</p>`,
data() {
return {
pick: "",
first: "first",
second: "second"
};
}
};
例如 select 动态的绑定值:
const app = {
template: `
<p>
{{selected}}
<select v-model="selected">
<!-- 内联对象字面量 -->
<option :value="{ number: 123 }">123</option>
</select>
</p>`,
data() {
return {
selected: "",
};
}
};
修饰符
.lazy
默认情况下,v-model
会在每次input
事件后更新数据。通过.lazy
修饰符来改为在每次change
事件后更新数据:
const app = {
template: `
<p>
{{textValue}}
<input type="text" v-model="textValue" />
<input type="text" v-model.lazy="textValue" />
</p>`,
data() {
return {
textValue: "",
};
}
};
.number
让用户输入自动转换为数字,你可以在v-model
后添加.number
修饰符来管理输入:
<input v-model.number="age" />
:::warning
⚠️ 注意
如果该值无法被parseFloat()
处理,那么将返回原始值。.number
修饰符会在输入框有type="number"
时自动启用。
:::
.trim
想要默认自动去除用户输入内容中两端的空格,你可以在v-model
后添加.trim
修饰符:
<input v-model.trim="msg" />