v-model基本用法
表单控件在实际业务较为常见,比如单选、多选、下拉选择、输入框等,用它们可以完成数据的录入、校验、提交等。 Vue 提供了 v-model 指令,用于在表单类元素上双向绑定数据。
例如在输入框上使用时,输入的内容会实时映射到绑定的数据上。
<div id="List-area">
姓名:<input :type="inputType" :placeholder="placeInfo" v-model="userName" />
<h2>您好:{{userName}}</h2>
</div>
<script type="text/javascript">
var List-area = new Vue({
el:"#List-area",
data:{
inputType:'text',
placeInfo:'请输入您的姓名',
userName:''
}
})
</script>
在输入框输入的同时,{ { message } }也会实时将内容渲染在视图中。
对于文本域 textarea 也是同样的用法
<div id="List-area">
评价:<textarea :placeholder="placeInfo" v-model="assess"></textarea>
<h2>评语:{{assess}}</h2>
</div>
<script type="text/javascript">
var List-area = new Vue({
el:"#List-area",
data:{
placeInfo:'请输入您的评价',
assess:''
}
})
</script>
注意事项
注意:
①使用 v-model 后,表单控件显示的值只依赖所绑定的数据,不再关心初始化时的 value属性(解耦初始化value属性)
<input
:type="inputType"
:placeholder="placeInfo"
value="我是初始默认值"
v-model="userName"
/>
②对于< textarea> 之间插入的值,不会生效(覆盖文本域)
<div id="app">
<textarea v-model="Introduce">我是...</textarea>
</div>
<script type="text/javascript">
var app=new Vue({
el:"#app",
data:{
Introduce:'大家好'
}
})
</script>
注意:
③使用 v-model 时,如果是用中文输入法输入中文,一般在没有选定饲组前,也就是在拼音阶段, Vue 是不会更新数据的,当敲下汉字时才会触发更新。如果希望总是实时更新,可以用@input 来替代 v-model ,只不过v-model会在不同的表单上进行智能处理。
<div id="app">
<textarea v-on:input="Introduce">我是默认初始值</textarea>
<p>
评语:{{message}}
</p>
</div>
<script type="text/javascript">
var app=new Vue({
el:"#app",
data:{
message:''
},
methods:{
Introduce:function(event){
this.message = event.target.value;
}
}
});
</script>
单选框/按钮
1)单独使用
单选按钮在单独使用时,官方文档标明不需要 v-model ,可以直接使用 v-bind 绑定布尔类型为真选中,为否时不选。
但不推荐使用v-bind进行绑定,建议用 v-model 配合 value 使用。
<div id="app">
性别:
<label>男</label>
<input type="radio" v-bind:checked="picked"/>
</div>
<script type="text/javascript">
var app=new Vue({
el:"#app",
data:{
picked:false
}
});
</script>
<div id="app">
性别:
<label>男</label>
<input type="radio" v-model="picked" value="man"/>
</div>
<script type="text/javascript">
var app=new Vue({
el:"#app",
data:{
picked:''
}
});
</script>
(2)组合使用
如果是组合使用来实现互斥选择效果。
<div id="app">
专业
<label for="ui">UI</label>
<input id="ui" type="radio" v-model="profession" value="ui"/>
<label for="web">前端</label>
<input id="ui" type="radio" v-model="profession" value="web"/>
<label for="web">PHP</label>
<input id="ui" type="radio" v-model="profession" value="PHP"/>
<p>您选择的专业是{{profession}}</p>
</div>
<script type="text/javascript">
var app=new Vue({
el:"#app",
data:{
profession:'ui'
}
});
</script>
数据 profession值与单选按钮的 value 值一致时,就会选中该项。
复选框/多选按钮
复选框也分单独使用和组合使用,不过用法稍与单选不同。
(1)单独使用
复选框单独使用时,是用 v-model来绑定一个布尔值。(注意:虽然v-bind绑定后的效果也一样,但只是效果一样,数据并未发生改动)
<div id="app">
<label>多选按钮</label>
<input type="checkbox" v-bind:checked="status"/>
</div>
<script type="text/javascript">
var app=new Vue({
el:"#app",
data:{
status:true
}
});
</script>
(1)单独使用
因为v-bind绑定单个多选按钮无法实现数据驱动,所以单独使用复选框时,语法指令为v-model
<div id="app">
<label>多选按钮</label>
<input type="checkbox" v-model="status"/>
</div>
<script type="text/javascript">
var app=new Vue({
el:"#app",
data:{
status:true
}
});
(1)单独使用
对上面案例进行修改调整
<div id="app">
<label for="checked">选择状态{{status}}</label>
<input id="checkbox" type="checkbox" v-model="status"/>
</div>
<script type="text/javascript">
var app=new Vue({
el:"#app",
data:{
status:true
}
});
</script>
此时在勾选时,数据status值变为了true, label 渲染的内容也会更新。
此时在勾选时,数据status值变为了true, label 渲染的内容也会更新。
(2)组合使用
组合使用时,也是v-model与value 一起,多个勾选框都绑定到同一个数组类型的数据,value的值在数组当中,就会选中这一项。这一过程是双向的,在勾选时value 的值也会自动 push这个数组中,示例代码如下
<div id="app">
<label for="swim">游泳</label>
<input type="checkbox" v-model="checkList" value="swim" id="swim"/>
<label for="ps">爬山</label>
<input type="checkbox" v-model="checkList" value="ps" id="ps"/>
<label for="lh">轮滑</label>
<input type="checkbox" v-model="checkList" value="lh" id="lh"/>
<p>你选择的爱好有{{checkList}}</p>
</div>
<script type="text/javascript">
var app=new Vue({
el:"#app",
data:{
checkList:[]
}
});
</script>
Vue实现全选与全不选1
<div id="app">
全选:<input type="checkbox" v-model="checkAll" @click="changeStatus"/>
<ul>
<li v-for="book in books" :key="book.name">
{{book.name}}
<input type="checkbox" v-model="checkList" :value="book.name"/>
</li>
</ul>
<p>选项:{{checkList}}</p>
</div>
<script type="text/javascript">
var app=new Vue({
el:"#app",
data:{
checkAll:false,
checkList:[],
books:[
{name:'西游记'},
{name:'三国演义'},
{name:'红楼梦'},
{name:'水浒传'}
]
},
methods:{
changeStatus:function(){
var _this = this;
if(!_this.checkAll){
_this.books.forEach(function(item,index){
_this.checkList.push(item.name)
})
}else{
_this.checkList = [];
}
}
}
});
</script>
<div id="app">
全选:<input type="checkbox" v-model="checkAll" @click="changeStatus" />
<ul>
<li v-for="book in books">
{{book.name}}
<input type="checkbox" v-model="book.changeStatus" />
</li>
</ul>
</div>
<script type="text/javascript">
var app = new Vue({
el: "#app",
data: {
checkAll: false,
books: [
{name: '西游记',changeStatus: false},
{name: '三国演义',changeStatus: false},
{name: '红楼梦',changeStatus: false},
{name: '水浒传',changeStatus: false},
]
},
methods: {
changeStatus:function(){
if (this.checkAll) {
this.books.forEach(function(item,index){
item.changeStatus = false
})
}else{
this.books.forEach(function(item,index){
item.changeStatus = true
})
}
}
}
});
</script>
下拉选择列表
选择列表就是下拉选择器,也是常见的表单控件,同样也分为单选和多选两种方式。
单选:
多选:
给添加属性 multiple 就可以多选了, 此时v-model 绑定的是一个数组。与复选框用法类似,多选:按住Ctrl+点击即可。
动态下拉选择列表
在业务中,经常用 v-for 动态输出,value和text 也是用 v-bind 来动态输出的。例如:
表单输入绑定修饰符
.lazy延迟修饰符
在默认情况下,v-model 在每次 input 事件触发后将输入框的值与数据进行同步 (除了上述输入法组合文字时)。可以添加 lazy 修饰符,从而转变为使用 change 事件进行同步:
.number数字修饰符
这通常很有用,因为即使在 type=“number” 时,HTML 输入元素的值也总会返回字符串。如果想自动将用户的输入值转为数值类型,可以给 v-model 添加 number 修饰符
过滤空白修饰符
给 v-model 添加 trim 修饰符,可以自动过滤用户输入的首尾空白字符