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 相关文章推荐
Convert Seconds To Hours
Jun 16 Javascript
js和jquery批量绑定事件传参数一(新猪猪原创)
Jun 23 Javascript
JavaScript与Image加载事件(onload)、加载状态(complete)
Feb 14 Javascript
jquery ajax结合thinkphp的getjson实现跨域的方法
Jun 06 Javascript
非常优秀的JS图片轮播插件Swiper的用法
Jan 03 Javascript
Vue.js实战之通过监听滚动事件实现动态锚点
Apr 04 Javascript
Vue应用部署到服务器的正确方式
Jul 15 Javascript
input输入框内容实时监测(附代码)
Aug 15 Javascript
p5.js实现斐波那契螺旋的示例代码
Mar 22 Javascript
vue拖拽排序插件vuedraggable使用方法详解
Aug 21 Javascript
玩转Koa之koa-router原理解析
Dec 29 Javascript
js类的继承定义与用法分析
Jun 21 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桌面中心(四) 数据显示
2007/03/11 PHP
PHP中的流(streams)浅析
2015/07/02 PHP
php中访问修饰符的知识点总结
2019/01/27 PHP
JS在IE和FireFox之间常用函数的区别小结
2010/03/12 Javascript
Array的push与unshift方法性能比较分析
2011/03/05 Javascript
JavaScript中setUTCMilliseconds()方法的使用详解
2015/06/12 Javascript
javascript实现确定和取消提示框效果
2015/07/10 Javascript
浅谈EasyUI常用控件的禁用方法
2016/11/09 Javascript
jquery 判断是否支持Placeholder属性的方法
2017/02/07 Javascript
关于javascript获取内联样式与嵌入式样式的实例
2017/06/01 Javascript
JavaScript实现瀑布流图片效果
2017/06/30 Javascript
vue.js框架实现表单排序和分页效果
2017/08/09 Javascript
详解如何让Express支持async/await
2017/10/09 Javascript
解决Jstree 选中父节点时被禁用的子节点也会选中的问题
2017/12/27 Javascript
vue解决使用webpack打包后keep-alive不生效的方法
2018/09/01 Javascript
js实现动态增加文件域表单功能
2018/10/22 Javascript
python快速查找算法应用实例
2014/09/26 Python
python 循环while和for in简单实例
2016/08/16 Python
pytorch 实现模型不同层设置不同的学习率方式
2020/01/06 Python
Tkinter中复选菜单是否被选中的判断与设置方式
2020/03/04 Python
Windows 下更改 jupyterlab 默认启动位置的教程详解
2020/05/18 Python
Python实现播放和录制声音的功能
2020/08/12 Python
python自动提取文本中的时间(包含中文日期)
2020/08/31 Python
python中的unittest框架实例详解
2021/02/05 Python
新护士岗前培训制度
2014/02/02 职场文书
财政专业求职信范文
2014/02/19 职场文书
超市促销活动总结
2014/07/01 职场文书
2015年检验科工作总结
2015/04/27 职场文书
恰同学少年观后感
2015/06/08 职场文书
汤姆叔叔的小屋读书笔记
2015/06/30 职场文书
初中开学典礼新闻稿
2015/07/17 职场文书
暑假生活随笔
2015/08/15 职场文书
文艺部部长竞选稿
2015/11/21 职场文书
MySQL 覆盖索引的优点
2021/05/19 MySQL
JavaWeb Servlet实现网页登录功能
2021/07/04 Java/Android
各种货币符号快捷输入
2022/02/17 杂记