浅谈 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图片放大镜功能的实例代码
Mar 26 Javascript
JavaScript中的数据类型转换方法小结
Oct 26 Javascript
JavaScript 实现的 zip 压缩和解压缩工具包Zip.js使用详解
Dec 14 Javascript
简单分析javascript中的函数
Sep 10 Javascript
js中的eval()函数把含有转义字符的字符串转换成Object对象的方法
Dec 02 Javascript
JS碰撞运动实现方法详解
Dec 15 Javascript
javascript 显示全局变量与隐式全局变量的区别
Feb 09 Javascript
jQuery实现简单弹窗遮罩效果
Feb 27 Javascript
Bootbox将后台JSON数据填充Form表单的实例代码
Sep 10 Javascript
jquery validate 实现动态增加/删除验证规则操作示例
Oct 28 jQuery
node.js使用 http-proxy 创建代理服务器操作示例
Feb 10 Javascript
解决vue addRoutes不生效问题
Aug 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生成的一个树叶图片画图例子
2014/04/16 PHP
PHP连接MySQL进行增、删、改、查操作
2017/02/19 PHP
thinkPHP简单导入和使用阿里云OSSsdk的方法
2017/03/15 PHP
Add a Picture to a Microsoft Word Document
2007/06/15 Javascript
jquery 插件实现图片延迟加载效果代码
2010/02/06 Javascript
菜鸟javascript基础资料整理2
2010/12/06 Javascript
JS 自定义带默认值的函数
2011/07/21 Javascript
jquery实现兼容浏览器的图片上传本地预览功能
2013/10/14 Javascript
jQuery中parentsUntil()方法用法实例
2015/01/07 Javascript
jquery图片倾斜层叠切换特效代码分享
2015/08/27 Javascript
JS实现n秒后自动跳转的两种方法
2020/11/30 Javascript
JavaScript中的splice方法用法详解
2016/07/20 Javascript
jquery datatable服务端分页
2016/08/31 Javascript
javascript 组合按键事件监听实现代码
2017/02/21 Javascript
原生JS京东轮播图代码
2017/03/22 Javascript
Vue.js学习教程之列表渲染详解
2017/05/17 Javascript
webpack多入口文件页面打包配置详解
2018/01/09 Javascript
微信小程序实现指定显示行数多余文字去掉用省略号代替
2018/07/25 Javascript
elementUI select组件默认选中效果实现的方法
2019/03/25 Javascript
记录微信小程序 height: calc(xx - xx);无效问题
2019/12/30 Javascript
[04:40]DOTA2-DPC中国联赛1月26日Recap集锦
2021/03/11 DOTA
python Django框架实现自定义表单提交
2016/03/25 Python
横向对比分析Python解析XML的四种方式
2016/03/30 Python
详解pandas数据合并与重塑(pd.concat篇)
2019/07/09 Python
python函数声明和调用定义及原理详解
2019/12/02 Python
python PIL/cv2/base64相互转换实例
2020/01/09 Python
keras实现多GPU或指定GPU的使用介绍
2020/06/17 Python
使用CSS3来代替JS实现交互
2017/08/10 HTML / CSS
喜诗官方在线巧克力店:See’s Candies
2017/01/01 全球购物
澳大利亚电子产品购物网站:Dick Smith
2017/02/02 全球购物
美国山地自行车、露营、户外装备和服装购物网站:Aventuron
2018/05/05 全球购物
退休党员个人对照检查材料思想汇报
2014/09/29 职场文书
2015年班主任德育工作总结
2015/05/21 职场文书
2016年社会主义核心价值观心得体会
2016/01/21 职场文书
python3使用diagrams绘制架构图的步骤
2021/04/08 Python
一次SQL查询优化原理分析(900W+数据从17s到300ms)
2022/06/10 SQL Server