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 相关文章推荐
javascript判断并获取注册表中可信任站点的方法
Jun 01 Javascript
jquery点击缩略图切换视频播放特效代码分享
Sep 15 Javascript
JavaScript中三种异步上传文件方式
Mar 06 Javascript
jQuery循环遍历子节点并获取值的方法
Apr 14 Javascript
javascript数组去重方法分析
Dec 15 Javascript
Javascript之图片的延迟加载的实例详解
Jul 24 Javascript
IE11下使用canvas.toDataURL报SecurityError错误的解决方法
Nov 19 Javascript
微信小程序之几种常见的弹框提示信息实现详解
Jul 11 Javascript
jquery图片预览插件实现方法详解
Jul 18 jQuery
基于vue、react实现倒计时效果
Aug 26 Javascript
js中Function引用类型常见有用的方法和属性详解
Dec 11 Javascript
JS实现页面数据懒加载
Feb 13 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目录导航文件代码
2006/10/09 PHP
高性能PHP框架Symfony2经典入门教程
2014/07/08 PHP
Yii实现自动加载类地图的方法
2015/04/01 PHP
PHP+swoole实现简单多人在线聊天群发
2016/01/19 PHP
PHP简单实现无限级分类的方法
2016/05/13 PHP
Prototype使用指南之ajax
2007/01/10 Javascript
JavaScript 编程引入命名空间的方法
2007/06/29 Javascript
WordPress 插件——CoolCode使用方法与下载
2007/07/02 Javascript
js arguments对象应用介绍
2012/11/28 Javascript
Js判断参数(String,Array,Object)是否为undefined或者值为空
2013/11/04 Javascript
javascript实现des解密加密全过程
2014/04/03 Javascript
javascript 实现map集合
2015/04/03 Javascript
微信小程序 wx.request(object) API详解及实例代码
2016/09/30 Javascript
浅析如何利用JavaScript进行语音识别
2016/10/27 Javascript
使用Promise链式调用解决多个异步回调的问题
2017/01/15 Javascript
js 实现获取name 相同的页面元素并循环遍历的方法
2017/02/14 Javascript
Js实现京东无延迟菜单效果实例(demo)
2017/06/02 Javascript
Vue2.5 结合 Element UI 之 Table 和 Pagination 组件实现分页功能
2018/01/26 Javascript
详解在create-react-app使用less与antd按需加载
2018/12/06 Javascript
利用JS如何获取form表单数据
2019/12/19 Javascript
Javascript Worker子线程代码实例
2020/02/20 Javascript
vue中选中多个选项并且改变选中的样式的实例代码
2020/09/16 Javascript
Python二维码生成库qrcode安装和使用示例
2014/12/16 Python
Python数据分析之真实IP请求Pandas详解
2016/11/18 Python
Python使用SQLite和Excel操作进行数据分析
2018/01/20 Python
Pycharm 设置自定义背景颜色的图文教程
2018/05/23 Python
python 已知三条边求三角形的角度案例
2020/04/12 Python
德国游戏机商店:Konsolenkost
2019/12/08 全球购物
小班重阳节活动方案
2014/02/08 职场文书
房地产资料员岗位职责
2014/07/02 职场文书
给校长的一封检讨书
2014/09/20 职场文书
出纳年终工作总结2014
2014/12/05 职场文书
户外活动总结
2015/02/04 职场文书
Vue CLI中模式与环境变量的深入详解
2021/05/30 Vue.js
Springboot如何使用logback实现多环境配置?
2021/06/16 Java/Android