浅谈 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程序来实现动画功能
Mar 06 Javascript
用JS做的简单的可折叠的两级树形菜单
Sep 21 Javascript
For循环中分号隔开的3部分的执行顺序探讨
May 27 Javascript
SuperSlide2实现图片滚动特效
Jun 20 Javascript
ZeroClipboard插件实现多浏览器复制功能(支持firefox、chrome、ie6)
Aug 30 Javascript
简介JavaScript中Boolean.toSource()方法的使用
Jun 05 Javascript
JS+CSS实现仿支付宝菜单选中效果代码
Sep 25 Javascript
基于JavaScript实现移除(删除)数组中指定元素
Jan 04 Javascript
Javascript的表单与验证-非空验证
Mar 18 Javascript
js实现精确到毫秒的倒计时效果
Aug 05 Javascript
jQuery中Datatables增加跳转到指定页功能
Feb 08 Javascript
js将URL网址转为16进制加密与解密函数
Mar 04 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
谈谈PHP语法(4)
2006/10/09 PHP
PHP 巧用数组降低程序的时间复杂度
2010/01/01 PHP
php 无极分类(递归)实现代码
2010/01/05 PHP
php简单提示框alert封装函数
2010/08/08 PHP
php实现下载限制速度示例分享
2014/02/13 PHP
php 删除cookie方法详解
2014/12/01 PHP
php轻松实现文件上传功能
2016/03/03 PHP
PHP 的比较运算与逻辑运算详解
2016/05/12 PHP
JSON字符串传到后台PHP处理问题的解决方法
2016/06/05 PHP
PHP获取访问页面HTTP状态码的实现代码
2016/11/03 PHP
PHP实现删除多重数组对象属性并重新赋值的方法
2017/06/07 PHP
PHP实现对数字分隔加千分号的方法
2019/03/18 PHP
PHP常用正则表达式精选(推荐)
2019/05/28 PHP
javaScript - 如何引入js代码
2021/03/09 Javascript
利用jQuery 实现GridView异步排序、分页的代码
2010/02/06 Javascript
js日历功能对象
2012/01/12 Javascript
javascript 拷贝节点cloneNode()使用介绍
2014/04/03 Javascript
JavaScript函数获取事件源的小例子
2014/05/14 Javascript
JavaScript中的cacheStorage使用详解
2015/07/29 Javascript
jQuery自制提示框tooltip改进版
2016/08/01 Javascript
AngularJs bootstrap搭载前台框架——基础页面
2016/09/01 Javascript
js实现StringBuffer的简单实例
2016/09/02 Javascript
详解nodejs微信公众号开发——2.自动回复
2017/04/10 NodeJs
手把手教你把nodejs部署到linux上跑出hello world
2017/06/19 NodeJs
Angular2 自定义validators的实现方法
2017/07/05 Javascript
nodejs密码加密中生成随机数的实例代码
2017/07/17 NodeJs
微信小程序scroll-view实现滚动穿透和阻止滚动的方法
2018/08/20 Javascript
js屏蔽退格键(backspace或者叫后退键与F5)
2019/02/10 Javascript
python 生成目录树及显示文件大小的代码
2009/07/23 Python
Python实现的FTP通信客户端与服务器端功能示例
2018/03/28 Python
Django用户认证系统 User对象解析
2019/08/02 Python
使用python创建生成动态链接库dll的方法
2020/05/09 Python
倩碧美国官网:Clinique美国
2016/07/20 全球购物
教导主任竞聘演讲稿
2014/05/16 职场文书
2014年督导工作总结
2014/11/19 职场文书
让子弹飞观后感
2015/06/11 职场文书