3.1 v-model的基础用法
v-model会忽略所有表单元素的value、checked、selected特性的初始值,而总是将Vue实例的数据作为数据来源。通过JavaScript在组件的data选项中声明初始值。v-model本质上是一个语法糖。
示例代码如下:
<input v-model="test">
本质上来讲,上面的代码和下面的代码作用一致:
<input :value="test" @input="test = $event.target.value">
其中,@input是对<input>输入事件的监听;:value="test"是将监听事件中的数据放入input。下面是v-model的一个简单例子。
此处需要强调一点,v-model不仅可以给input赋值,还可以获取input中的数据,而且数据的获取是实时的,因为语法糖中是用@input对输入框进行监听的。
可以在如下div中加入<p>{{test}}</p>来获取input数据,然后修改input中数据,会发现<p></p>中数据随之改变。
我们看下面的示例。在data代码块中定义一个变量test,然后在input组件中使用v-model="test"来实现双向绑定,完整示例代码如下:
<div id="app"> <input v-model="test"> <!-- <input :value="test" @input="test= $event.target.value"> --><!--语法糖--> </div> <script src="/resources/js/vue.js"></script> <script> new Vue({ el: '#app', data: { test: '这是一个测试' } }); </script>
3.1.1 在input中使用
在input输入框中,我们可以使用v-model指令来实现双向数据绑定。
我们接下来做一个示例:当改变input的内容时,显示内容同步改变。具体步骤如下:
1)在Vue.js的data区域定义一个变量message,同时给它一个初始值。
2)通过{{…}}语法,将变量message的值显示在页面。
3)使用v-model="message",将input标签双向绑定值到变量message。
4)尝试改变input标签里面的值,变量message的值也会同步改变。
示例代码如下:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>双向数据绑定v-model指令(input)</title> <!--加载本地vue.js的框架--> <script src="vue2.2.2.min.js"></script> </head> <body> <!--定义div代码块的id的值,这里定义的值为app,后面Vue会使用该值--> <div id="app"> <!--input输入框的内容改变的时候,这里的内容也改变--> <p>{{ message }}</p> <!--input双向绑定到属性message--> <input v-model="message"> </div> <script> //下面是Vue.js的代码块-开始 new Vue({ el: '#app',//app为前面div代码块的id的值,通过“#”绑定 //data区域定义属性的值 data: { message: 'Vue教程' //后面没有数据,则这里定义完毕后面不需要跟上逗号“,” } }) //Vue.js的代码块-结束 </script> </body> </html>
效果如图3-1和图3-2所示。
图3-1 input页面初始化显示内容
图3-2 改变input输入框的内容,显示内容同步改变
3.1.2 在textarea中使用
在textarea输入框中,我们可以使用v-model指令来实现双向数据绑定。
我们接下来做一个示例:在改变textarea的内容时,显示内容同步改变。具体步骤如下:
1)在Vue.js的data区域定义一个变量message,同时给它一个初始值。
2)通过{{…}}语法,将变量message的值显示在页面。
3)使用v-model="message",将textarea标签双向绑定值到变量message。
4)尝试改变textarea标签里面的值,变量message的值也会同步改变。
示例代码如下:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>双向数据绑定v-model指令(textarea)</title> <!--加载本地vue.js的框架--> <script src="vue2.2.2.min.js"></script> </head> <body> <!--定义div代码块的id的值,这里定义的值为app,后面Vue会使用该值--> <div id="app"> <!--input输入框的内容改变的时候,这里的内容也改变--> <p>{{ message }}</p> <!--textarea双向绑定到属性message--> <textarea v-model="message"></textarea> </div> <script> //下面是Vue.js的代码块-开始 new Vue({ el: '#app',//app为前面div代码块的id的值,通过“#”绑定 //data区域定义属性的值 data: { message: 'Vue教程' //后面没有数据,则这里定义完毕后面不需要跟上逗号“,” } }) //Vue.js的代码块-结束 </script> </body> </html>
效果如图3-3和图3-4所示。
图3-3 textarea页面初始化显示内容
图3-4 改变textarea输入框的内容,显示的内容同步改变
3.1.3 在select中使用
在select输入框中,我们可以使用v-model指令来实现双向数据绑定。
在select中实现双向数据绑定时,有个核心知识点要注意,select中默认选项是v-model绑定的值。
我们接下来做一个示例:当改变select下拉选项时,显示内容同步改变。具体步骤如下:
1)在Vue.js的data区域定义一个变量xuanzhong,同时给它一个初始值。
2)通过{{…}}语法,将变量xuanzhong的值显示在页面。
3)使用v-model="message",将select标签双向绑定值到变量xuanzhong。
4)尝试改变select下拉选项,变量xuanzhong的值也会同步改变。
示例代码如下:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>双向数据绑定v-model指令(select)</title> <!--加载本地vue.js的框架--> <script src="vue2.2.2.min.js"></script> </head> <body> <!--定义div代码块的id的值,这里定义的值为app,后面Vue会使用该值--> <div id="app"> <!--select双向绑定到属性xuanzhong,默认会选中该属性值对应的项目--> <select v-model="xuanzhong" name="shuiguo"> <option value="0">请选择</option> <option value="p">苹果</option> <option value="x">香蕉</option> <option value="l">荔枝</option> </select> <!--上面select选项改变的时候,下面的xuanzhong显示的内容也会改变--> <span>默认: {{ xuanzhong }}</span> </div> <script> //下面是Vue.js的代码块-开始 new Vue({ el: '#app',//app为前面div代码块的id的值,通过“#”绑定 //data区域定义属性的值 data: { xuanzhong:"x" //后面没有数据,则这里定义完毕后面不需要跟上逗号“,” } }) //Vue.js的代码块-结束 </script> </body> </html>
效果如图3-5~图3-7所示。
图3-5 select页面初始化,默认显示x
图3-6 select默认显示的下拉选项
图3-7 改变select的下拉选项,显示的值同步改变
3.1.4 在checkbox(单选)中使用
在checkbox输入框中,我们可以使用v-model指令来实现双向数据绑定。
在checkbox中实现双向数据绑定时,有个核心知识点要注意,checkbox中默认选项是v-model绑定的值。
我们接下来做一个示例:当改变checkbox选中选项时,显示内容同步改变。具体步骤如下:
1)在Vue.js的data区域定义一个变量xuanzhong,同时给它一个初始值。
2)通过{{…}}语法,将变量xuanzhong的值显示在页面。
3)使用v-model="message",将checkbox标签双向绑定值到变量xuanzhong。
4)尝试改变checkbox选中状态,变量xuanzhong的值也会同步改变。
示例代码如下:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>双向数据绑定v-model指令(checkbox单选)</title> <!--加载本地vue.js的框架--> <script src="vue2.2.2.min.js"></script> </head> <body> <!--定义div代码块的id的值,这里定义的值为app,后面Vue会使用该值--> <div id="app"> <!--input双向绑定到属性xuanzhong,默认该值为true,则下面的input处于选中状态--> <input type="checkbox" v-model="xuanzhong" id="c1"> <!--label中for属性的值和上面input中id的值一致来实现两者点击的绑定--> <!--input选中状态改变的时候,下面显示的内容也会改变--> <label for="c1">{{xuanzhong}}</label> </div> <script> //下面是Vue.js的代码块-开始 new Vue({ el: '#app',//app为前面div代码块的id的值,通过“#”绑定 //data区域定义属性的值 data: { xuanzhong: true, //定义默认值为true //后面没有数据,则这里定义完毕后面不需要跟上逗号“,” } }) //Vue.js的代码块-结束 </script> </body> </html>
效果如图3-8和图3-9所示。
图3-8 checkbox(单选)页面初始化,默认选中true
图3-9 改变checkbox(单选)选中状态,显示的值同步改变
3.1.5 在checkbox(多选)中使用
checkbox多选和单选的原理一致,区别在于checkbox单选项的值为true和false,多选项的值为数组。
示例代码如下:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>双向数据绑定v-model指令(checkbox单选)</title> <!--加载本地vue.js的框架--> <script src="vue2.2.2.min.js"></script> </head> <body> <!--定义div代码块的id的值,这里定义的值为app,后面Vue会使用该值--> <div id="app"> <!--input双向绑定到属性xuanzhong,默认该值为“天津”, 则下面对应的选中处于选中状态--> <input type="checkbox" v-model="xuanzhong" value="天津">天津 <input type="checkbox" v-model="xuanzhong" value="北京">北京 <input type="checkbox" v-model="xuanzhong" value="上海">上海 <!--input选中状态改变的时候,下面显示的内容也会改变--> <br><label for="">{{xuanzhong}}</label> </div> <script> //下面是Vue.js的代码块-开始 new Vue({ el: '#app',//app为前面div代码块的id的值,通过“#”绑定 //data区域定义属性的值 data: { xuanzhong:["天津"] //选中项为数组 //后面没有数据,则这里定义完毕后面不需要跟上逗号“,” } }) //Vue.js的代码块-结束 </script> </body> </html>
效果如图3-10和图3-11所示。
图3-10 checkbox(单选)页面初始化,默认选中“天津”
图3-11 改变checkbox(多选)多选项,显示的值同步改变
3.1.6 在radio(单选)中使用
我们接下来做一个示例:当改变radio选中状态时,显示内容同步改变。具体步骤如下:
1)在Vue.js的data区域定义一个变量moren,同时给它一个初始值。
2)通过{{…}}语法,将变量moren的值显示在页面。
3)使用v-model="moren",将radio标签双向绑定值到变量message。
4)尝试改变radio选项的状态,变量moren的值也会同步改变。
示例代码如下:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>双向数据绑定v-model指令(radio单选)</title> <!--加载本地vue.js的框架--> <script src="vue2.2.2.min.js"></script> </head> <body> <!--定义div代码块的id的值,这里定义的值为“app”,后面Vue会使用该值--> <div id="app"> <!--input双向绑定到属性moren,默认该值为“男”,则下面对应的选项处于选中状态--> <input type="radio" v-model="moren" value="男"> 男 <input type="radio" v-model="moren" value="女"> 女 <!--input选中状态改变的时候,下面显示的内容也会改变--> <br>性别:<span>{{moren}}</span> </div> <script> //下面是Vue.js的代码块-开始 new Vue({ el: '#app',//app为前面div代码块的id的值,通过“#”绑定 //data区域定义属性的值 data: { moren: "男" //定义默认值 //后面没有数据,则这里定义完毕后面不需要跟上逗号“,” } }) //Vue.js的代码块-结束 </script> </body> </html>
效果如图3-12和图3-13所示。
图3-12 radio页面初始化,默认选中“男”
图3-13 改变radio页面选项,显示的值同步改变
3.1.7 在链接a中应用
网页中的链接a标签有两个常用的属性:href和target,我们可以通过v-bind:指令将对应的属性绑定到Vue.js中data属性的值。
我们接下来做一个示例:在Vue.js中a标签使用v-bind:指令。具体步骤如下:
1)在Vue.js的data区域定义变量wangzhi(网址)和变量target(打开新窗口)。
2)在a标签中,使用v-bind:href="wangzhi"绑定网址,使用v-bind:target="target"绑定新窗口打开属性。完整示例代码如下:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>双向数据绑定v-model指令(链接a应用)</title> <!--加载本地vue.js的框架--> <script src="vue2.2.2.min.js"></script> </head> <body> <!--定义div代码块的id的值,这里定义的值为app,后面Vue会使用该值--> <div id="app"> <!--打开一个到淘宝的页面,网址通过参数的形式传递--> <a v-bind:href="wangzhi" v-bind:target="target">黄老师站点</a><br> </div> <script> //下面是Vue.js的代码块-开始 new Vue({ el: '#app',//app为前面div代码块的id的值,通过“#”绑定 //data区域定义属性的值 data: { wangzhi: 'http://www.8895.org',//定义网址 //后面还有数据,则这里定义完毕后面需要跟上逗号“,” target:'_blank' //链接在新窗口打开 //后面没有数据,则这里定义完毕后面不需要跟上逗号“,” } }) //Vue.js的代码块-结束 </script> </body> </html>
效果如图3-14所示。
图3-14 a标签页面初始化效果图
3.1.8 在图片中使用
网页中图片标签img常用的属性是srct,我们可以通过v-bind:指令将对应的属性绑定到Vue.js中data属性的值。
我们接下来做一个实例:在Vue.js中img标签使用v-bind:指令。具体步骤如下:
1)在Vue.js的data区域定义变量tupiandizhi(图片地址)。
2)在img标签,使用v-bind:src="tupiandizhi"绑定图片地址。
完整示例代码如下:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>双向数据绑定v-model指令(图片img)</title> <!--加载本地vue.js的框架--> <script src="vue2.2.2.min.js"></script> </head> <body> <!--定义div代码块的id的值,这里定义的值为app,后面Vue会使用该值--> <div id="app"> <!--加载一个图片,图片的地址通过参数传递--> <img v-bind:src="tupiandizhi" width="50"></img><br> </div> <script> //下面是Vue.js的代码块-开始 new Vue({ el: '#app',//app为前面div代码块的id的值,通过“#”绑定 //data区域定义属性的值 data: { tupiandizhi:'img/v.png'//定义图片地址 //后面没有数据,则这里定义完毕后面不需要跟上逗号“,” } }) //Vue.js的代码块-结束 </script> </body> </html>
效果如图3-15所示。
图3-15 img标签页面初始化效果图