浅谈 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 相关文章推荐
Jquery submit()无法提交问题
Apr 21 Javascript
详谈LABJS按需动态加载js文件
May 07 Javascript
ECMAScript6新增值比较函数Object.is
Jun 12 Javascript
js实现仿MSN带关闭功能的右下角弹窗代码
Sep 04 Javascript
详解JavaScript数组的操作大全
Oct 19 Javascript
jquery mobile 移动web(5)
Dec 20 Javascript
JavaScript实现斗地主游戏的思路
Feb 29 Javascript
EasyUI布局 高度自适应
Jun 04 Javascript
BootStrap Typeahead自动补全插件实例代码
Aug 10 Javascript
jQuey将序列化对象在前台显示地实现代码(方法总结)
Dec 13 Javascript
js仿搜狐视频记录片列表展示效果
May 30 Javascript
微信小程序实现自动定位功能
Oct 31 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
基于mysql的bbs设计(四)
2006/10/09 PHP
mysql From_unixtime及UNIX_TIMESTAMP及DATE_FORMAT日期函数
2010/03/21 PHP
PHP利用func_get_args和func_num_args函数实现函数重载实例
2014/11/12 PHP
php通过session防url攻击方法
2014/12/10 PHP
WordPress中用于获取及自定义头像图片的PHP脚本详解
2015/12/17 PHP
Yii遍历行下每列数据的方法
2016/10/17 PHP
JavaScript 脚本将当地时间转换成其它时区
2009/03/19 Javascript
Input 特殊事件onpopertychange和oninput
2009/06/17 Javascript
JQUBAR1.1 jQuery 柱状图插件发布
2010/11/28 Javascript
Node.js:Windows7下搭建的Node.js服务(来玩玩服务器端的javascript吧,这可不是前端js插件)
2011/06/27 Javascript
$.ajax返回的JSON无法执行success的解决方法
2011/09/09 Javascript
jquery中的事件处理详细介绍
2013/06/24 Javascript
关于js数组去重的问题小结
2014/01/24 Javascript
jQuery旋转木马式幻灯片轮播特效
2015/12/04 Javascript
推荐阅读的js快速判断IE浏览器(兼容IE10与IE11)
2015/12/13 Javascript
js弹出窗口简单实现代码
2017/03/22 Javascript
详解打造 Vue.js 可复用组件
2017/03/24 Javascript
JS正则表达式验证中文字符
2017/05/08 Javascript
js事件触发操作实例分析
2019/06/21 Javascript
如何封装Vue Element的table表格组件
2021/02/06 Vue.js
[00:32]2018DOTA2亚洲邀请赛iG出场
2018/04/03 DOTA
python实现根据用户输入从电影网站获取影片信息的方法
2015/04/07 Python
Python使用logging结合decorator模式实现优化日志输出的方法
2016/04/16 Python
Python实现基于二叉树存储结构的堆排序算法示例
2017/12/08 Python
python实现验证码识别功能
2018/06/07 Python
提高python代码运行效率的一些建议
2020/09/29 Python
如何配置、使用和清除Smarty缓存
2015/12/23 面试题
国家励志奖学金获奖感言
2014/01/09 职场文书
校园奶茶店创业计划书
2014/01/23 职场文书
教师业务学习材料
2014/12/16 职场文书
初三英语教学计划
2015/01/23 职场文书
结婚通知短信大全
2015/04/17 职场文书
导游词之安徽醉翁亭
2020/01/10 职场文书
如何理解Vue前后端数据交互与显示
2021/05/10 Vue.js
分析mysql中一条SQL查询语句是如何执行的
2021/06/21 MySQL
如何用vue实现网页截图你知道吗
2021/11/17 Vue.js