浅谈 Vue v-model指令的实现原理
vue的v-model是一个十分强大的指令,它可以自动让原生表单组件的值自动和你选择的值绑定,
我们来看一下它的效果:
输入框的值和一个数据是绑定的,输入框的值变化,和他绑定的值也会发生变化
我们可以参照官方文档的例子 http://cn.vuejs.org/v2/guide/forms.html#文本
我们在手动输入 hello的过程中 下面和他绑定的p标签的值也是实时变化的
如此神奇的效果是如何实现的呢? 还是参照官方文档
http://cn.vuejs.org/v2/guide/components.html#使用自定义事件的表单输入组件
官方也说明了,v-model只不过是一个语法糖而已,真正的实现靠的还是
- v-bind:绑定响应式数据
- 触发 input 事件 并传递数据 (核心和重点)
现在我们也想设计自己的表单组件,也想通过 v-model暴露组件的值,怎么做呢?
例如我们要设计一个 自定义货币输入的组件, 通过 v-model暴露组件的值,我们可能使用如下的组件代码
<currency-input v-model="price"></currency-input>
然后再使用 这个我们自己定义的组件时, 组件内部会暴露出 组件的值到 v-model所绑定的值中去;那它是如何实现的呢?\
要搞明白v-model的实现,需要通过查看官方的自定义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事件
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(88)-Excel导入和导出-主从表结构导出
- WCF中的Binding模型之六(完结篇):从绑定元素认识系统预定义绑定
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(57)-插件---ueditor使用
- 何为正则表达式?要他有何用?
- 向silverlight传递自定义参数
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(87)-MVC Excel导入和导出
- sl从程序集中读取xaml文件
- WCF技术剖析之二十六:如何导出WCF服务的元数据(Metadata)[实现篇]
- WCF技术剖析之二十六:如何导出WCF服务的元数据(Metadata)[扩展篇]
- 如何解决打开VS2010后没有UI界面的问题
- RadRails1.0降临——增加Profiler、CallGraph Analyzer和Rails Shell等新特性
- Rails存储库从SVN转向Git
- 报告称10后已变成出境游“老司机”屌丝80后:我还没出过国
- 担心人工智能取代你的工作?听听微软科学家怎么说!
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- android使用ViewPager实现图片自动切换
- Android Studio 3.6 调试 smali的全过程
- Android 10 适配攻略小结
- Android P实现静默安装的方法示例(官方Demo)
- Android studio实现滑动开关
- Android实现TCP客户端支持读写操作
- Android通过命令连接wifi的方法(解决usb不能用问题)
- android studio使用SQLiteOpenHelper()建立数据库的方法
- Android自定义View绘制彩色圆弧
- android canvas使用line画半圆
- 说说Android的UI刷新机制的实现
- Android仿直播类app赠送礼物功能
- android自定义imageview实现圆角图片
- 基于android实现五子棋开发
- Android Fragment的静态注册和动态注册创建步骤