Vue.js 中的 v-model 指令及绑定表单元素的方法


Posted in Javascript onDecember 03, 2018

我们可以使用 Vue.js 中的 v-model 指令来完成表单数据的双向绑定。

1 基础用法

1.1 文本输入框(text)

这里演示了在文本输入框上输入的内容,会实时映射到绑定的数据上。

html:

<div id="app">
 <input type="text" v-model="content" placeholder="请输入">
 <p>输入框:{{content}}</p>
</div>

js:

<script>
 var app = new Vue({
  el: '#app',
  data: {
   content: ''
  }
 });
</script>

效果:

Vue.js 中的 v-model 指令及绑定表单元素的方法

1.2 大文本输入框(textarea)

绑定方法与文本输入框相同。

html:

<div id="app2">
 <textarea v-model="content" placeholder="请输入"></textarea>
 <p>内容:</p>
 <p style="white-space: pre">{{content}}</p>
</div>

js:

var app2 = new Vue({
 el: '#app2',
 data: {
  content: ''
 }
});

效果:

Vue.js 中的 v-model 指令及绑定表单元素的方法

这里对展示的内容所对应的 <p> 元素加了 white-space: pre 样式,这样内容即使带有回车符也会保留。

--------------------------------------------------------------------------------

注意:表单控件所显示的值只依赖于所绑定的数据,所以即便设置了表单控件中的 value值,也不会起作用哦。同理,<textarea>xxx</textarea>之间的值也无效。

之前的示例我们可以发现,使用中文输入法时,只有确定选中的词语,才会被如果 Vue.js 所更新。如果希望输入的内容实时更新,那么可以使用 @input。

html:

<div id="app3">
 <textarea @input="inputHandler" placeholder="请输入"></textarea>
 <p>内容:</p>
 <p style="white-space: pre">{{content}}</p>
</div>

js:

var app3 = new Vue({
 el: '#app3',
 data: {
  content: ''
 },
 methods: {
  inputHandler: function (event) {
   this.content = event.target.value;
  }
 }
});

可以看出,即使在 @input 定义的函数不带参数,Vue.js 也会在定义的函数(示例中的 inputHandler)中传入 event 原生事件对象。

效果:

Vue.js 中的 v-model 指令及绑定表单元素的方法

1.3 单选框

单选框一般都有多个条件可供选择,既然是单选框,自然希望实现互斥效果,我们可以使用 v-model 指令配合单选框的 value 来实现。

html:

<div id="app4">
 <input id="radio1" type="radio" v-model="checked" value="文学">
 <label for="radio1">文学</label>
 <input id="radio2" type="radio" v-model="checked" value="艺术">
 <label for="radio2">艺术</label>
 <input id="radio3" type="radio" v-model="checked" value="经济">
 <label for="radio3">经济</label>
 <br>
 <p>选择了:{{checked}}</p>
</div>

js:

var app4 = new Vue({
 el: '#app4',
 data: {
  checked: '文学'
 }
});

效果:

Vue.js 中的 v-model 指令及绑定表单元素的方法

1.4 复选框

复选框的绑定方式与单选框相同,只不过复选框所对应的数据类型是数组罢了。

html:

<div id="app5">
 <input id="checkbox1" type="checkbox" v-model="checked" value="文学">
 <label for="checkbox1">文学</label>
 <input id="checkbox2" type="checkbox" v-model="checked" value="艺术">
 <label for="checkbox2">艺术</label>
 <input id="checkbox3" type="checkbox" v-model="checked" value="经济">
 <label for="checkbox3">经济</label>
 <br>
 <p>选择了:{{checked}}</p>
</div>

js:

var app5= new Vue({
 el: '#app5',
 data: {
  checked: ['文学','艺术']
 }
});

效果:

Vue.js 中的 v-model 指令及绑定表单元素的方法

1.5 下拉选择框

1.5.1 单选

html:

<div id="app6">
 <select v-model="selected">
  <option value="1">文学</option>
  <option value="2">艺术</option>
  <option>经济</option>
 </select>
 <br>
 <p>选择了:{{selected}}</p>
</div>

js:

var app6 = new Vue({
 el: '#app6',
 data: {
  selected: '1'
 }
});

效果:

Vue.js 中的 v-model 指令及绑定表单元素的方法

可以看出,如果 <option> 含有 value 值,则会先匹配该值;如果没有,则匹配 <option> 中的 text 值(比如示例中的 <option>经济</option>)。

1.5.2 多选

为 <select> 标签添加 multiple 属性,即可实现多选。

html:

<div id="app7">
 <select v-model="selected" multiple>
  <option value="1">文学</option>
  <option value="2">艺术</option>
  <option>经济</option>
 </select>
 <br>
 <p>选择了:{{selected}}</p>
</div>

Vue.js 中的 v-model 指令及绑定表单元素的方法

在实际应用场景,<select> 标签中的 <opinion> 一般是通过 v-for 指令动态输出的,其中每一项的 value 或 text 都可以使用 v-bind 动态输出的。

html:

<div id="app8">
 <select v-model="selected">
  <option v-for="option in options"
     :value="option.value">{{option.text}}
  </option>
 </select>
 <br>
 <p>选择了:{{selected}}</p>
</div>

js:

var app8 = new Vue({
 el: '#app8',
 data: {
  selected: '1',
  options: [
   {text: '文学', value: '1'},
   {text: '艺术', value: '2'}
  ]
 }
});

效果:

Vue.js 中的 v-model 指令及绑定表单元素的方法

--------------------------------------------------------------------------------

因为 select 标签的呈现样式依赖于浏览器,所以在实际业务场景中,我们更多的是使用 div 来模拟 select 标签的列表功能,而这可以通过使用 Vue.js 自定义组件的方式来实现一个通用的下拉选择组件。

以上示例 DEMO

2 绑定动态变量

之前所说的示例,v-model 绑定的都是静态变量。我们可以使用 v-bind 来绑定动态变量。

2.1 单选框

html:

<div id="app">
 <input id="radio1" type="radio" v-model="picked" :value="value">
 <label for="radio1">文学</label>
 <input id="radio2" type="radio" v-model="picked" :value="value2">
 <label for="radio2">艺术</label>
 <input id="radio3" type="radio" v-model="picked" :value="value3">
 <label for="radio3">经济</label>
 <br>
 <p>{{picked}}</p>
 <p>{{value}},{{value2}},{{value3}}</p>
</div>

js:

var app = new Vue({
 el: '#app',
 data: {
  picked: false,
  value: '文学',
  value2: '艺术',
  value3: '经济',
 }
});

效果:

Vue.js 中的 v-model 指令及绑定表单元素的方法

示例中定义的单选框默认值为 picked 所定义的 false。当选中某个单选框时,则动态绑定在 :value 中定义的变量。

2.2 复选框

html:

<div id="app2">
 <input id="checkbox" type="checkbox" v-model="checked" :true-value="value1" :false-value="value2">
 <label for="checkbox">开关</label>
 <p>checked:{{checked}}</p>
 <p>value1:{{value1}}</p>
 <p>value2:{{value2}}</p>
</div>

js:

var app2 = new Vue({
 el: '#app2',
 data: {
  value1: '亮',
  value2: '暗',
  checked: ''
 }
});

效果:

Vue.js 中的 v-model 指令及绑定表单元素的方法

复选框的默认值绑定的是 v-model 定义的变量,而勾选与取消勾选所绑定的值,则分别由 :true-value 与 false-value 来实现动态绑定。

2.3 下拉选择框

html:

<div id="app3">
 <select v-model="selected">
  <option :value="{number:1}">文学</option>
  <option :value="{number:2}">艺术</option>
 </select>
 <br>
 <p>选择了:{{selected.number}}</p>
</div>

js:

var app3 = new Vue({
 el: '#app3',
 data: {
  selected: ''
 }
});

效果:

Vue.js 中的 v-model 指令及绑定表单元素的方法

当选中某个 option 时,app3.selected 为 Object,所以 selected.number 即为 :value 定义的绑定值。

以上示例 DEMO

Javascript 相关文章推荐
jquery 1.3.2 IE8中的一点点的小问题解决方法
Jul 10 Javascript
JavaScript Cookie显示用户上次访问的时间和次数
Dec 08 Javascript
用Javascript来生成ftp脚本的小例子
Jul 03 Javascript
ExtJS 刷新后如何默认选中刷新前最后一次选中的节点
Apr 03 Javascript
Vue 过渡(动画)transition组件案例详解
Jan 22 Javascript
详解Vue 事件驱动和依赖追踪
Apr 22 Javascript
利用C/C++编写node.js原生模块的方法教程
Jul 07 Javascript
简单的网页广告特效实例
Aug 19 Javascript
JavaScript实现快速排序的方法分析
Jan 10 Javascript
vue获取当前激活路由的方法
Mar 17 Javascript
create-react-app安装出错问题解决方法
Sep 04 Javascript
如何在Express4.x中愉快地使用async的方法
Nov 18 Javascript
ng-zorro-antd 入门初体验
Dec 03 #Javascript
如何使用 vue + d3 画一棵树
Dec 03 #Javascript
Vue.js中 v-model 指令的修饰符详解
Dec 03 #Javascript
浅谈ng-zorro使用心得
Dec 03 #Javascript
JS跨域请求的问题解析
Dec 03 #Javascript
VueJS 组件参数名命名与组件属性转化问题
Dec 03 #Javascript
Vue.Draggable拖拽功能的配置使用方法
Jul 29 #Javascript
You might like
咖啡店都有些什么常规豆子呢?有什么风味在里面
2021/03/04 咖啡文化
php 操作数组(合并,拆分,追加,查找,删除等)
2012/07/20 PHP
PHP动态生成指定大小随机图片的方法
2016/03/25 PHP
php mysql操作mysql_connect连接数据库实例详解
2016/12/26 PHP
js检测客户端不是firefox则提示下载
2007/04/07 Javascript
js textarea自动增高并隐藏滚动条
2009/12/16 Javascript
JavaScript Ajax Json实现上下级下拉框联动效果实例代码
2013/11/23 Javascript
javascript中数组array及string的方法总结
2014/11/28 Javascript
推荐一个自己用的封装好的javascript插件
2015/01/29 Javascript
使用AngularJS创建单页应用的编程指引
2015/06/19 Javascript
Node.js与Sails ~项目结构与Mvc实现及日志机制
2015/10/14 Javascript
总结JavaScript中布尔操作符||与&amp;&amp;的使用技巧
2015/11/17 Javascript
javascript RegExp 使用说明
2016/05/21 Javascript
js实现弹窗居中的简单实例
2016/10/09 Javascript
leaflet的开发入门教程
2016/11/17 Javascript
原生实现一个react-redux的代码示例
2018/06/08 Javascript
微信小程序实现获取准确的腾讯定位地址功能示例
2019/03/27 Javascript
[42:39]老党炸弹人试玩视频
2014/09/03 DOTA
[03:17]史诗级大片应援2018DOTA2国际邀请赛 致敬每一位坚守遗迹的勇士
2018/07/20 DOTA
Python中关于字符串对象的一些基础知识
2015/04/08 Python
20招让你的Python飞起来!
2016/09/27 Python
Python使用pickle模块存储数据报错解决示例代码
2018/01/26 Python
Python中反射和描述器总结
2018/09/23 Python
python用post访问restful服务接口的方法
2018/12/07 Python
Python数据可视化之画图
2019/01/15 Python
使用Python做定时任务及时了解互联网动态
2019/05/15 Python
pytorch实现focal loss的两种方式小结
2020/01/02 Python
解决pyCharm中 module 调用失败的问题
2020/02/12 Python
python实现不同数据库间数据同步功能
2021/02/25 Python
CSS3 animation实现简易幻灯片轮播特效
2016/09/27 HTML / CSS
HTML5新特性之语义化标签
2017/10/31 HTML / CSS
银行营业厅大堂经理岗位职责
2014/01/06 职场文书
销售个人求职信范文
2014/04/28 职场文书
2015年父亲节寄语
2015/03/23 职场文书
JavaScript中的宏任务和微任务详情
2021/11/27 Javascript
python单向链表实例详解
2022/05/25 Python