Vue 进阶教程之v-model详解


Posted in Javascript onMay 06, 2017

Vue 官网教程上关于 v-model 的讲解不是十分的详细,写这篇文章的目的就是详细的剖析一下, 并介绍 Vue 2.2  v-model改进的地方,然后穿插的再说点 Vue 的小知识。

在 Vue 中,有许多方法和 Angular 相似,这主要是因为 Angular 是 Vue 早期开发的灵感来源。然而,Augular 中存在许多问题,在 Vue 中已经得到解决。

v-model 用在 input 元素上时

v-model虽然很像使用了双向数据绑定的 Angular 的 ng-model,但是 Vue 是单项数据流,v-model 只是语法糖而已:↓

<input v-model="sth" />
<input v-bind:value="sth" v-on:input="sth = $event.target.value" />

第一行的代码其实只是第二行的语法糖。然后第二行代码还能简写成这样:↓

<input :value="sth" @input="sth = $event.target.value" />

要理解这行代码,首先你要知道 input 元素本身有个 oninput 事件,这是 HTML5 新增加的,类似 onchange ,每当输入框内容发生变化,就会触发 oninput ,把最新的value传递给 sth。

如果你不知道 $event 是从哪来的,那你需要点击它再复习一下文档。

我们仔细观察语法糖和原始语法那两行代码,可以得出一个结论:

在给 <input /> 元素添加 v-model 属性时,默认会把 value 作为元素的属性,然后把 'input' 事件作为实时传递 value 的触发事件

v-model 用在组件上时

v-model 不仅仅能在 input上用,在组件上也能使用,下面是一个和 Vue 官网教程类似的例子(在看这个例子时我们要考虑两个问题):

Vue 进阶教程之v-model详解

父组件的 price 的初始值是 100,更改子组件的值能实时更新父组件的 price

<div id="demo">
 <currency-input v-model="price"></currentcy-input>
 <span>{{price}}</span>
</div>
<script src="https://cdn.bootcss.com/vue/2.3.0/vue.js"></script>
<script>
Vue.component('currency-input', {
 template: `
  <span>
   <input
    ref="input"
    :value="value"
    <!--为什么这里把 'input' 作为触发事件的事件名?`input` 在哪定义的?-->
    @input="$emit('input', $event.target.value)"
   >
  </span>
 `,
 props: ['value'],// 为什么这里要用 value 属性,value在哪里定义的?貌似没找到啊?
})

var demo = new Vue({
 el: '#demo',
 data: {
  price: 100,
 }
})
</script>

如果你知道这两个问题的答案,那么恭喜你真正掌握了 v-model,如果你没明白,那么可以看下这段代码:↓

<currency-input v-model="price"></currentcy-input>
<!--上行代码是下行的语法糖
 <currency-input :value="price" @input="price = arguments[0]"></currency-input>
-->

现在你知道 value 和 input 从哪来的了吧。与上面总结的类似:

给组件添加 v-model 属性时,默认会把 value 作为组件的属性,然后把 'input' 值作为给组件绑定事件时的事件名

v-model 的缺点和解决办法

在创建类似复选框或者单选框的常见组件时,v-model就不好用了。

<input type="checkbox" v-model="sth" />

v-model 给我们提供好了 value 属性和 oninput 事件,但是,我们需要的不是 value 属性,而是 checked 属性,并且当你点击这个单选框的时候不会触发 oninput 事件,它只会触发 onchange 事件。这就尴尬了?

因为 v-model 只是用到了 input 元素上,所以这种情况好解决:↓

<input type="checkbox" :checked="status" @change="status = $event.target.checked" />

当 v-model 用到组件上时:↓

<my-checkbox v-model="foo"></my-checkbox>

Vue.component('my-checkbox', {
 tempalte: `<input 
        type="checkbox"
        @change="$emit('input', $event.target.checked)"
        :checked="value"
       />`
 props: ['value'],
})

在 Vue 2.2 版本,你可以在定义组件时通过 mode l选项的方式来定制 prop/event:↓

<my-checkbox v-model="foo"></my-checkbox>

Vue.component('my-checkbox', {
 tempalte: `<input 
        type="checkbox"
        <!--这里就不用 input 了,而是 balabala-->
        @change="$emit('balabala', $event.target.checked)"
        :checked="value"
       />`
 props: ['checked'], //这里就不用 value 了,而是 checked
 model: {
  prop: 'checked',
  event: 'balabala'
 },
})

看到这里我相信你肯定理解了 Vue 的 v-model,文中如有错误,欢迎在评论中指出谢谢。希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
游戏人文件夹程序 ver 4.03
Jul 14 Javascript
使用jQuery重置(reset)表单的方法
May 05 Javascript
js实现同一页面可多次调用的图片幻灯切换效果
Feb 28 Javascript
javascript图片切换综合实例(循环切换、顺序切换)
Jan 13 Javascript
Bootstrap每天必学之按钮(Button)插件
Apr 25 Javascript
JS 设置Cookie 有效期 检测cookie
Jun 15 Javascript
jquery的 filter()方法使用教程
Mar 22 jQuery
解决node修改后需频繁手动重启的问题
May 13 Javascript
基于vue展开收起动画的示例代码
Jul 05 Javascript
js中let能否完全替代IIFE
Jun 15 Javascript
VUE页面中通过双击实现复制表格中内容的示例代码
Jun 11 Javascript
JS实现简单控制视频播放倍速的实例代码
Apr 18 Javascript
jQuery动态追加页面数据以及事件委托详解
May 06 #jQuery
AngularJS封装$http.post()实例详解
May 06 #Javascript
JavaScript瀑布流布局实现代码
May 06 #Javascript
jquery点赞功能实现代码 点个赞吧!
May 29 #jQuery
jQuery extend()详解及简单实例
May 06 #jQuery
jquery仿微信聊天界面
May 06 #jQuery
Javascript实现页面滚动时导航智能定位
May 06 #Javascript
You might like
CodeIgniter php mvc框架 中国网站
2008/05/26 PHP
解析php curl_setopt 函数的相关应用及介绍
2013/06/17 PHP
使用php的HTTP请求的库Requests实现美女图片墙
2015/02/22 PHP
详解PHP错误日志的获取方法
2015/07/20 PHP
php mysqli查询语句返回值类型实例分析
2016/06/29 PHP
php与c 实现按行读取文件实例代码
2017/01/03 PHP
php支付宝系列之电脑网站支付
2018/05/30 PHP
JavaScript 特殊字符
2007/04/05 Javascript
网页和浏览器兼容性问题汇总(draft1)
2009/06/01 Javascript
document.getElementById方法在Firefox与IE中的区别
2010/05/18 Javascript
Javascript中call与apply的学习笔记
2014/09/22 Javascript
JavaScript使用shift方法移除素组第一个元素实例分析
2015/04/06 Javascript
基于Jquery插件Uploadify实现实时显示进度条上传图片
2020/03/26 Javascript
JavaScript中的数组遍历forEach()与map()方法以及兼容写法介绍
2016/05/19 Javascript
JS操作JSON方法总结(推荐)
2016/06/14 Javascript
Javascript ES6中数据类型Symbol的使用详解
2017/05/02 Javascript
vue2.0 自定义日期时间过滤器
2017/06/07 Javascript
angular 用拦截器统一处理http请求和响应的方法
2017/06/08 Javascript
JS实现提交表单前的数字及邮箱校检功能
2017/11/13 Javascript
使用vue2.6实现抖音【时间轮盘】屏保效果附源码
2019/04/24 Javascript
JavaScript 防盗链的原理以及破解方法
2020/12/29 Javascript
浅谈python数据类型及类型转换
2017/12/18 Python
树莓派动作捕捉抓拍存储图像脚本
2019/06/22 Python
Python 一键获取百度网盘提取码的方法
2019/08/01 Python
Python 一行代码能实现丧心病狂的功能
2020/01/18 Python
python批量生成条形码的示例
2020/10/10 Python
加拿大最大的相机店:Henry’s
2017/05/17 全球购物
医大实习自我鉴定
2013/12/07 职场文书
《金钱的魔力》教学反思
2014/02/24 职场文书
公司司机岗位职责范本
2014/03/03 职场文书
国际语言毕业生求职信
2014/07/08 职场文书
处级干部考察材料
2014/12/24 职场文书
小学教师师德师风自我评价
2015/03/04 职场文书
车间安全生产管理制度
2015/08/06 职场文书
导游词之蓬莱长岛
2019/12/17 职场文书
星际争霸 Light vs Action 一场把教主看到鬼畜的比赛
2022/04/01 星际争霸