浅谈 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 相关文章推荐
setAttribute 与 class冲突解决
Feb 17 Javascript
文本框的字数限制功能jquery插件
Nov 24 Javascript
javascript中的array数组使用技巧
Jan 31 Javascript
js的参数有长度限制吗?发现不能超过2083个字符
Apr 20 Javascript
javascript实用方法总结
Feb 06 Javascript
js中日期的加减法
May 06 Javascript
详解JavaScript中双等号引起的隐性类型转换
May 30 Javascript
浅谈js继承的实现及公有、私有、静态方法的书写
Oct 28 Javascript
JavaScript严格模式下关于this的几种指向详解
Jul 12 Javascript
Vue打包后访问静态资源路径问题
Nov 08 Javascript
关于ES6尾调用优化的使用
Sep 11 Javascript
vuex页面刷新导致数据丢失的解决方案
Dec 10 Vue.js
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
ThinkPHP实例化模型的四种方法概述
2014/08/22 PHP
javascript 命名空间以提高代码重用性
2008/11/13 Javascript
从jQuery.camelCase()学习string.replace() 函数学习
2011/09/13 Javascript
JS获取DropDownList的value值与text值的示例代码
2014/01/07 Javascript
JS中判断JSON数据是否存在某字段的方法
2014/03/07 Javascript
使用CamanJS在Web页面上处理图像的技巧
2015/08/18 Javascript
jQuery采用连缀写法实现的折叠菜单效果
2015/09/18 Javascript
JS简单编号生成器实现方法(附demo源码下载)
2016/04/05 Javascript
jQuery实现获取元素索引值index的方法
2016/09/18 Javascript
javascript replace()第二个参数为函数时的参数用法
2016/12/26 Javascript
DWR3 访问WEB元素的两种方法实例详解
2017/01/03 Javascript
jquery实现简单实用的轮播器
2017/05/23 jQuery
vue2利用Bus.js如何实现非父子组件通信详解
2017/08/25 Javascript
静态页面实现 include 引入公用代码的示例
2017/09/25 Javascript
Vue2.0子同级组件之间数据交互方法
2018/02/28 Javascript
vue.js通过路由实现经典的三栏布局实例代码
2018/07/08 Javascript
基于vue的验证码组件的示例代码
2019/01/22 Javascript
Angular 多级路由实现登录页面跳转(小白教程)
2019/11/19 Javascript
[04:50]DOTA2亚洲邀请赛小组赛第四日 TOP10精彩集锦
2015/02/02 DOTA
[49:35]LGD vs OG 2018国际邀请赛淘汰赛BO3 第二场 8.25
2018/08/29 DOTA
详解如何利用Cython为Python代码加速
2018/01/27 Python
python实现求解列表中元素的排列和组合问题
2018/03/15 Python
如何在python字符串中输入纯粹的{}
2018/08/22 Python
详解python执行shell脚本创建用户及相关操作
2019/04/11 Python
python multiprocessing模块用法及原理介绍
2019/08/20 Python
Python调用接口合并Excel表代码实例
2020/03/31 Python
荷兰包包购物网站:The Little Green Bag
2018/03/17 全球购物
请解释一下webService? 如何用.net实现webService
2014/06/09 面试题
社区中秋节活动方案
2014/01/29 职场文书
安全协议书范本
2014/04/21 职场文书
文员求职信
2014/07/15 职场文书
老乡聚会通知
2015/04/23 职场文书
军训新闻稿范文
2015/07/17 职场文书
只用50行Python代码爬取网络美女高清图片
2021/06/02 Python
Python如何使用循环结构和分支结构
2022/04/13 Python
使用refresh_token实现无感刷新页面
2022/04/26 Javascript