浅谈 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中判断控件是否存在
Aug 25 Javascript
写得不错的jquery table鼠标经过变色代码
Sep 27 Javascript
jquery动态改变onclick属性导致失效的问题解决方法
Dec 04 Javascript
JavaScript自定义日期格式化函数详细解析
Jan 14 Javascript
node.js中的fs.exists方法使用说明
Dec 17 Javascript
javascript数据结构之二叉搜索树实现方法
Nov 25 Javascript
JS代码防止SQL注入的方法(超简单)
Apr 12 Javascript
Javascript农历与公历相互转换的简单实例
Oct 09 Javascript
css和js实现弹出登录居中界面完整代码
Nov 26 Javascript
VUE基于NUXT的SSR 服务端渲染
Nov 30 Javascript
OpenLayers3实现测量功能
Sep 25 Javascript
详解Typescript里的This的使用方法
Jan 08 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守护进程 加linux命令nohup实现任务每秒执行一次
2011/07/04 PHP
hadoop中一些常用的命令介绍
2013/06/19 PHP
php中运用http调用的GET和POST方法示例
2014/09/29 PHP
基于JQuery.timer插件实现一个计时器
2010/04/25 Javascript
扩展jquery实现客户端表格的分页、排序功能代码
2011/03/16 Javascript
IE的有条件注释判定IE版本详解(附实例代码)
2012/01/04 Javascript
jquery scrollTop方法根据滚动像素显示隐藏顶部导航条
2013/05/27 Javascript
浅析jQuery(function(){})与(function(){})(jQuery)之间的区别
2014/01/09 Javascript
javascript关于继承的用法汇总
2014/12/20 Javascript
JS实现可编辑的后台管理菜单功能【附demo源码下载】
2016/09/13 Javascript
nodejs 搭建简易服务器的图文教程(推荐)
2017/07/18 NodeJs
详解React 在服务端渲染的实现
2017/11/16 Javascript
vue与原生app的对接交互的方法(混合开发)
2018/11/28 Javascript
JavaScript页面加载事件实例讲解
2019/09/01 Javascript
layer.confirm点击第一个按钮关闭弹出框的方法
2019/09/09 Javascript
JavaScript实现动态留言板
2020/03/16 Javascript
vue穿梭框实现上下移动
2021/01/29 Vue.js
python 剪切移动文件的实现代码
2018/08/02 Python
python使用Plotly绘图工具绘制散点图、线形图
2019/04/02 Python
python的turtle库使用详解
2019/05/10 Python
TensorFlow索引与切片的实现方法
2019/11/20 Python
Python实现结构体代码实例
2020/02/10 Python
python numpy库np.percentile用法说明
2020/06/08 Python
python爬虫快速响应服务器的做法
2020/11/24 Python
通过css3的filter滤镜改变png图片的颜色的示例代码
2020/05/06 HTML / CSS
详解使用HTML5 Canvas创建动态粒子网格动画
2016/12/14 HTML / CSS
英国计算机产品零售商:Novatech(定制个人电脑、笔记本电脑、工作站和服务器)
2018/01/28 全球购物
Interflora澳大利亚:同日鲜花速递
2019/06/25 全球购物
挖掘机司机岗位职责
2014/02/12 职场文书
护理专业自荐书
2014/06/04 职场文书
思想作风整顿个人剖析材料
2014/10/06 职场文书
民间借贷借条范本
2015/05/25 职场文书
表扬稿表扬信的格式及范文
2019/06/24 职场文书
python基于tkinter制作无损音乐下载工具
2021/03/29 Python
详解Java实现数据结构之并查集
2021/06/23 Java/Android
vue router 动态路由清除方式
2022/05/25 Vue.js