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解决图片缩放及其优化的代码
May 23 Javascript
JS小游戏之极速快跑源码详解
Sep 25 Javascript
JavaScript使用cookie实现记住账号密码功能
Apr 27 Javascript
javascript实现在下拉列表中显示多级树形菜单的方法
Aug 12 Javascript
JavaScript iframe数据共享接口实现方法
Jan 06 Javascript
jQuery 移动端artEditor富文本编辑器
Jan 11 Javascript
jquery购物车结算功能实现方法
Oct 29 Javascript
详解vue2.0+axios+mock+axios-mock+adapter实现登陆
Jul 19 Javascript
用Fundebug插件记录网络请求异常的方法
Feb 21 Javascript
小程序实现搜索框功能
Mar 26 Javascript
js设置默认时间跨度过程详解
Jul 17 Javascript
JS精确判断数据类型代码实例
Dec 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
用libTemplate实现静态网页的生成
2006/10/09 PHP
PHP仿盗链代码
2012/06/03 PHP
destoon实现调用图文新闻的方法
2014/08/21 PHP
javascript OFFICE控件测试代码
2009/12/08 Javascript
window.name代替cookie的实现代码
2010/11/28 Javascript
jqGrid jQuery 表格插件测试代码
2011/08/23 Javascript
jquery弹窗插件colorbox绑定动态生成元素的方法
2014/06/20 Javascript
JavaScript Length 属性的总结
2015/11/02 Javascript
jQuery拖拽排序插件制作拖拽排序效果(附源码下载)
2016/02/23 Javascript
JS关闭窗口时产生的事件及用法示例
2016/08/20 Javascript
JavaScript和jQuery获取input框的绝对位置实现方法
2016/10/13 Javascript
走进javascript——不起眼的基础,值和分号
2017/02/24 Javascript
深入理解Commonjs规范及Node模块实现
2017/05/17 Javascript
浅谈mint-ui 填坑之路
2017/11/06 Javascript
在Angular中使用JWT认证方法示例
2018/09/10 Javascript
jquery操作select常见方法大全【7种情况】
2019/05/28 jQuery
vue中使用 pako.js 解密 gzip加密字符串的方法
2019/06/10 Javascript
vue.js实现备忘录demo
2019/06/26 Javascript
python 读取txt,json和hdf5文件的实例
2018/06/05 Python
Python-copy()与deepcopy()区别详解
2019/07/12 Python
PyCharm 配置远程python解释器和在本地修改服务器代码
2019/07/23 Python
tensorflow 实现自定义layer并添加到计算图中
2020/02/04 Python
python读取配置文件方式(ini、yaml、xml)
2020/04/09 Python
推荐技术人员一款Python开源库(造数据神器)
2020/07/08 Python
python Xpath语法的使用
2020/11/26 Python
Skyscanner台湾:全球知名的旅行比价引擎
2018/07/01 全球购物
MIKI HOUSE美国官方网上商店:日本领先的婴儿和儿童高级时装品牌
2020/06/21 全球购物
研修第一天随笔感言
2014/02/15 职场文书
公司司机岗位职责范本
2014/03/03 职场文书
机关作风整顿个人整改措施2014
2014/09/17 职场文书
学习三严三实心得体会
2014/10/13 职场文书
伊索寓言读书笔记
2015/06/30 职场文书
老干部局2015年度工作总结
2015/10/22 职场文书
小学三年级数学教学反思
2016/02/16 职场文书
2019生态环境保护倡议书!
2019/07/03 职场文书
详解MySQL 联合查询优化机制
2021/05/10 MySQL