浅析Vue自定义组件的v-model


Posted in Javascript onNovember 26, 2017

最近在学习vue,今天看到自定义事件的表单输入组件,纠结了一会会然后恍然大悟...官方教程写得不是很详细,所以我决定总结一下。

v-model语法糖

v-model实现了表单输入的双向绑定,我们一般是这么写的:

<div id="app">
   <input v-model="price">
 </div>
 new Vue({
   el: '#app',
   data: {
     price: ''
   }
 });

通过该语句实现price变量与输入值双向绑定

实际上v-model只是一个语法糖,真正的实现是这样的:

<input type="text" 


:value="price" 



@input="price=$event.target.value">

以上代码分几个步骤:

1.将输入框的值绑定到price变量上,这个是单向绑定,意味着改变price变量的值可以改变input的value,但是改变value不能改变price

2.监听input事件(input输入框都有该事件,当输入内容时自动触发该事件),当输入框输入内容就单向改变price的值

这样就实现了双向绑定。

自定义表单输入组件

我们平时写input可以不像上面那么复杂,直接用v-model就行了,但是既然我们研究这个语法糖那肯定是有别的用处,比如说自定义表单输入框组件。

<div id="app">
   <input-price v-model="price"></input-price>
 </div>
 Vue.component('input-price', {
   template: '<input type='text'>'
 });
 new Vue({
   el: '#app',
   data: {
     price: ''
   }
 });

上面的<input-price>是我们自定义的表单输入组件,我们能直接用v-model实现双向绑定吗?如果你觉得可以那你就是Too young了~

首先根据我们的v-model语法糖来看

1.我们的子组件(input-price)的value需要绑定一个从父组件传来的值,通过子组件的props接收
2.在子组件上有新的输入时需要触发父组件的input事件,并将新的值作为参数传递给父组件

<div id="app"> 
   <!-- <price-input v-model="price"></price-input> -->
 
   <!-- 手动实现了v-model双向绑定 -->
   <!-- 3、父组件的input事件被触发,将传来的值赋给父组件的变量price -->
   <!-- 4、父组件value的值绑定到price -->
   <price-input :value="price" @input="onInput"></price-input>
   <p>{{price}}</p>
 </div>
 Vue.component('price-input', {
   // 5、将父组件的value值通过props传递给子组件
   // 1、当有数据输入时触发了该组件的input事件
   template: '<input :value="value" @input="updateVal($event.target.value)" type="text">',
   props: ["value"], 
   methods: {
      updateVal: function(val) {
       // 2、手动触发父组件的input事件并将值传给父组件
       this.$emit('input', val); 
     }
   }
 });
 var app = new Vue({
   el: '#app',
   data: {
     price: ''
   },
   methods: {
      onInput: function(val) {
        this.price = val;
      }
    }
 });

这里备注了几个步骤:

1.当有数据输入时触发了该组件的input事件

2.手动触发父组件的input事件并将值传给父组件

3.父组件的input事件被触发,将传来的值赋给父组件的变量price,实现输入框value到父元素的price的单向绑定

4.父组件value的值绑定到price

5.将父组件的value值通过props传递给子组件,实现了父组件的price到子组件value的单向绑定

小小的总结一下:

•v-bind只能实现单向绑定
•v-model(v-bind+触发的input事件)实现双向绑定

以上所述是小编给大家介绍的浅析Vue自定义组件的v-model ,希望对大家有所帮助!

Javascript 相关文章推荐
js 实现无干扰阴影效果 简单好用(附文件下载)
Dec 27 Javascript
javascript常用正则表达式汇总
Jul 31 Javascript
JS实现适合于后台使用的动画折叠菜单效果
Sep 21 Javascript
微信小程序开发之实现选项卡(窗口顶部TabBar)页面切换
Nov 25 Javascript
JS实现的验证身份证及获取地区功能示例
Jan 16 Javascript
jQuery中Datatables增加跳转到指定页功能
Feb 08 Javascript
vue过渡和animate.css结合使用详解
Jun 14 Javascript
聊聊Vue.js的template编译的问题
Oct 09 Javascript
基于Proxy的小程序状态管理实现
Jun 14 Javascript
微信小程序解析富文本过程详解
Jul 13 Javascript
如何管理Vue中的缓存页面
Feb 06 Vue.js
html5 录制mp3音频支持采样率和比特率设置
Jul 15 Javascript
AngularJs 最新验证手机号码的实例,成功测试通过
Nov 26 #Javascript
Javacript中自定义的map.js  的方法
Nov 26 #Javascript
css和js实现弹出登录居中界面完整代码
Nov 26 #Javascript
js 判断一个数字是不是2的n次方幂的实例
Nov 26 #Javascript
微信小程序wx.request实现后台数据交互功能分析
Nov 25 #Javascript
利用JavaScript的%做隔行换色的实例
Nov 25 #Javascript
zTree节点文字过多的处理方法
Nov 24 #Javascript
You might like
Ajax PHP分页演示
2007/01/02 PHP
php设计模式 Chain Of Responsibility (职责链模式)
2011/06/26 PHP
PHP生成等比缩略图类和自定义函数分享
2014/06/25 PHP
ThinkPHP快速入门实例教程之数据分页
2014/07/01 PHP
php项目中百度 UEditor 简单安装调试和调用
2015/07/15 PHP
php创建无限级树型菜单
2015/11/05 PHP
用Div仿showModalDialog模式菜单的效果的代码
2007/03/05 Javascript
[原创]用javascript实现检测指定目录是否存在的方法
2008/01/12 Javascript
JS 图片缩放效果代码
2010/06/09 Javascript
jquery.tmpl JQuery模板插件
2011/10/10 Javascript
利用jQuery实现可以编辑的表格
2014/05/26 Javascript
Ztree新增角色和编辑角色回显问题的解决
2016/10/25 Javascript
使用jQuery实现简单的tab框实例
2017/08/22 jQuery
使用nvm管理不同版本的node与npm的方法
2017/10/31 Javascript
VUE接入腾讯验证码功能(滑块验证)备忘
2019/05/07 Javascript
Python自动调用IE打开某个网站的方法
2015/06/03 Python
利用Python实现命令行版的火车票查看器
2016/08/05 Python
Python3实现发送QQ邮件功能(html)
2017/12/15 Python
详解Python安装scrapy的正确姿势
2018/06/26 Python
python使用writerows写csv文件产生多余空行的处理方法
2019/08/01 Python
python深copy和浅copy区别对比解析
2019/12/26 Python
通过代码实例了解Python异常本质
2020/09/16 Python
用pip给python安装matplotlib库的详细教程
2021/02/24 Python
amazeui时间组件的实现示例
2020/08/18 HTML / CSS
新加坡航空官方网站:Singapore Airlines
2016/10/13 全球购物
美国最流行的男士时尚网站:Touch of Modern
2018/02/05 全球购物
Dr. Martens马汀博士德国官网:马丁靴鼻祖
2019/12/26 全球购物
SmartBuyGlasses荷兰:购买太阳镜和眼镜
2020/03/16 全球购物
澳大利亚领先的内衣店:Bendon Lingerie澳大利亚
2020/05/15 全球购物
师范毕业生求职自荐信
2013/09/25 职场文书
小区门卫工作职责
2013/12/14 职场文书
尊师重教演讲稿
2014/09/04 职场文书
2015年教师节贺卡寄语
2015/03/24 职场文书
物业客服专员岗位职责
2015/04/07 职场文书
防溺水主题班会教案
2015/08/12 职场文书
《小蝌蚪找妈妈》教学反思
2016/02/23 职场文书