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 相关文章推荐
IE/FireFox具备兼容性的拖动代码
Aug 13 Javascript
Prototype Class对象学习
Jul 19 Javascript
关于js datetime的那点事
Nov 15 Javascript
jquery 实现上下滚动效果示例代码
Aug 09 Javascript
jQuery获取上传文件的名称的正则表达式
May 21 Javascript
js使用cookie记录用户名的方法
Nov 26 Javascript
JavaScript实现类似淘宝的购物车效果
Mar 16 Javascript
详解vue项目优化之按需加载组件-使用webpack require.ensure
Jun 13 Javascript
微信小程序 检查接口状态实例详解
Jun 23 Javascript
angularJs使用ng-repeat遍历后选中某一个的方法
Sep 30 Javascript
JS co 函数库的含义和用法实例总结
Apr 08 Javascript
JS实现扫雷项目总结
May 19 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
测试php连接mysql是否成功的代码分享
2014/01/24 PHP
PHP数字和字符串ID互转函数(类似优酷ID)
2014/06/30 PHP
php+ajax实时输入自动搜索匹配的方法
2014/12/26 PHP
php实现每天自动变换随机问候语的方法
2015/05/12 PHP
PHP版微信第三方实现一键登录及获取用户信息的方法
2016/10/14 PHP
PHP生成word文档的三种实现方式
2016/11/14 PHP
Laravel中Facade的加载过程与原理详解
2017/09/22 PHP
PDO::rollBack讲解
2019/01/29 PHP
静态页面下用javascript操作ACCESS数据库(读增改删)的代码
2007/05/14 Javascript
在JS数组特定索引处指定位置插入元素的技巧
2014/08/24 Javascript
javascript生成不重复的随机数
2015/07/17 Javascript
JavaScript中附件预览功能实现详解(推荐)
2017/08/15 Javascript
three.js中3D视野的缩放实现代码
2017/11/16 Javascript
vue select二级联动第二级默认选中第一个option值的实例
2018/01/10 Javascript
微信小程序授权登陆及每次检查是否授权实例代码
2019/09/18 Javascript
js实现小星星游戏
2020/03/23 Javascript
Vue左滑组件slider使用详解
2020/08/21 Javascript
vue实现简单加法计算器
2020/10/22 Javascript
JQuery+drag.js上传图片并且实现图片拖曳
2020/11/18 jQuery
[03:40]DOTA2英雄梦之声_第01期_炼金术士
2014/06/23 DOTA
python文件操作之目录遍历实例分析
2015/05/20 Python
python中requests使用代理proxies方法介绍
2017/10/25 Python
在pycharm中使用git版本管理以及同步github的方法
2019/01/16 Python
分析运行中的 Python 进程详细解析
2019/06/22 Python
Python编写通讯录通过数据库存储实现模糊查询功能
2019/07/18 Python
将labelme格式数据转化为标准的coco数据集格式方式
2020/02/17 Python
污水厂厂长岗位职责
2014/01/04 职场文书
如何写自我评价?自我评价写什么好?
2014/03/14 职场文书
三好学生先进事迹材料
2014/08/28 职场文书
产品质量保证书范本
2015/02/27 职场文书
2015年综治维稳工作总结
2015/04/07 职场文书
2015年小学远程教育工作总结
2015/07/28 职场文书
导游词之丽江普济寺
2019/10/22 职场文书
解决WINDOWS电脑开机后桌面没有任何图标
2022/04/09 数码科技
Win11更新失败并提示0xc1900101
2022/04/19 数码科技
Android 界面一键变灰 深色主题工具类
2022/04/28 Java/Android