浅谈 Vue v-model指令的实现原理


Posted in Javascript onJune 08, 2017

vue的v-model是一个十分强大的指令,它可以自动让原生表单组件的值自动和你选择的值绑定,

我们来看一下它的效果:

输入框的值和一个数据是绑定的,输入框的值变化,和他绑定的值也会发生变化

我们可以参照官方文档的例子    http://cn.vuejs.org/v2/guide/forms.html#文本

浅谈 Vue v-model指令的实现原理

我们在手动输入 hello的过程中 下面和他绑定的p标签的值也是实时变化的

如此神奇的效果是如何实现的呢? 还是参照官方文档

http://cn.vuejs.org/v2/guide/components.html#使用自定义事件的表单输入组件

浅谈 Vue v-model指令的实现原理

官方也说明了,v-model只不过是一个语法糖而已,真正的实现靠的还是

  1. v-bind:绑定响应式数据
  2. 触发 input 事件 并传递数据 (核心和重点)

现在我们也想设计自己的表单组件,也想通过 v-model暴露组件的值,怎么做呢?

例如我们要设计一个 自定义货币输入的组件, 通过 v-model暴露组件的值,我们可能使用如下的组件代码

<currency-input v-model="price"></currency-input>

然后再使用 这个我们自己定义的组件时, 组件内部会暴露出 组件的值到 v-model所绑定的值中去;那它是如何实现的呢?\

要搞明白v-model的实现,需要通过查看官方的自定义v-model组件示例的部分代码来进行说明

浅谈 Vue v-model指令的实现原理

我们看上图中的代码,有行  $emit的代码,这行代码实际上会触发一个 input事件, 'input'后的参数就是传递给v-model绑定的属性的值,也就是说 v-model实现自定义的数据绑定的原理是这样的:

首先,大体的组件结构:

<custom-comp v-model="myattr">
  <input /> ??
  <select> ?? 
</custom-comp>

也就是自定义的组件内部一般包含原生的表单组件(当然非表单的组件也可以)

然后,给原生控件绑定事件,捕捉到原生组件的值,利用 $emit方法,触发input方法,组件监听到 input事件然后把值传入到myattr中.

这里有个疑问,为什么是 'input'呢??? 三个字,看文档!

这个就是 vue对 v-model实现的一个规则: 使用了v-model的组件会

自动监听 input 事件,并把这个input事件所携带的值 传递给v-model所绑定的属性!这样组件内部的值就给到了父组件了

通过以上讲解,我们总结一下如何利用v-model实现自定义的表单组件:

监听原生组件的事件,当获取到原生组件的值后把 值通过调用 $emit('input' ,data) 方法去触发 input事件 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JS Map 和 List 的简单实现代码
Jul 08 Javascript
jQuery prev ~ siblings选择器使用介绍
Aug 09 Javascript
简单的ajax连接库分享(不用jquery的ajax)
Jan 19 Javascript
JavaScript中伪协议 javascript:使用探讨
Jul 18 Javascript
Javascript核心读书有感之语句
Feb 11 Javascript
最简单的JavaScript验证整数、小数、实数、有效位小数正则表达式
Apr 17 Javascript
JavaScript实现的多种鼠标拖放效果
Nov 03 Javascript
AngularJS使用带属性值的ng-app指令实现自定义模块自动加载的方法
Jan 04 Javascript
js事件委托和事件代理案例分享
Jul 25 Javascript
vue 解决循环引用组件报错的问题
Sep 06 Javascript
layui自定义插件citySelect实现省市区三级联动选择
Jul 26 Javascript
node.js事件轮询机制原理知识点
Dec 22 Javascript
Vue如何实现组件的源码解析
Jun 08 #Javascript
jquery Ajax实现Select动态添加数据
Jun 08 #jQuery
js canvas实现放大镜查看图片功能
Jun 08 #Javascript
vue实现一个移动端屏蔽滑动的遮罩层实例
Jun 08 #Javascript
微信小程序开发之map地图实现教程
Jun 08 #Javascript
详解AngularJS用Interceptors来统一处理HTTP请求和响应
Jun 08 #Javascript
微信小程序开发之实现自定义Toast弹框
Jun 08 #Javascript
You might like
asp和php下textarea提交大量数据发生丢失的解决方法
2008/01/20 PHP
PHP的array_diff()函数在处理大数组时的效率问题
2011/11/27 PHP
PHP 验证身份证是否合法的函数
2017/02/09 PHP
PHP实现财务审核通过后返现金额到客户的功能
2019/07/04 PHP
用javascript父窗口控制只弹出一个子窗口
2007/04/10 Javascript
悄悄用脚本检查你访问过哪些网站的代码
2010/12/04 Javascript
基于jQuery插件实现环形图标菜单旋转切换特效
2015/05/15 Javascript
JS拖动鼠标画出方框实现鼠标选区的方法
2015/08/05 Javascript
javascript图片延迟加载实现方法及思路
2015/12/31 Javascript
jQuery遍历json的方法(推荐)
2016/06/12 Javascript
jQuery的deferred对象使用详解
2016/09/25 Javascript
jquery+css3问卷答题卡翻页动画效果示例
2016/10/26 Javascript
JavaScript数据结构之二叉树的查找算法示例
2017/04/13 Javascript
jQuery使用正则验证15/18身份证的方法示例
2017/04/27 jQuery
JS实现同一DOM元素上onClick事件与onDblClick事件并存的解决方法
2018/06/07 Javascript
Windows下Node爬虫神器Puppeteer安装记
2019/01/09 Javascript
layui 弹出层值回传解决方式
2019/11/14 Javascript
Vue-cli4 配置 element-ui 按需引入操作
2020/09/11 Javascript
python多进程操作实例
2014/11/21 Python
python实现一个简单的并查集的示例代码
2018/03/19 Python
在Python中过滤Windows文件名中的非法字符方法
2019/06/10 Python
Win10 安装PyCharm2019.1.1(图文教程)
2019/09/29 Python
Python脚本去除文件的只读性操作
2020/03/05 Python
Django Admin后台添加数据库视图过程解析
2020/04/01 Python
使用Matplotlib绘制不同颜色的带箭头的线实例
2020/04/17 Python
python编写一个会算账的脚本的示例代码
2020/06/02 Python
html5指南-1.html5全局属性(html5 global attributes)深入理解
2013/01/07 HTML / CSS
跑步爱好者一站式服务网站:Jack Rabbit
2016/09/01 全球购物
李维斯法国官网:Levi’s法国
2019/07/13 全球购物
毕业生自我鉴定
2013/11/05 职场文书
病媒生物防治方案
2014/05/13 职场文书
525心理活动总结
2014/07/04 职场文书
“三支一扶”支教教师思想汇报
2014/09/13 职场文书
村支部书记群众路线对照检查材料思想汇报
2014/10/08 职场文书
学习作风建设心得体会
2014/10/22 职场文书
Python实现DBSCAN聚类算法并样例测试
2021/06/22 Python