浅析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 相关文章推荐
javascript中获取选中对象的类型
Apr 02 Javascript
jQuery DIV弹出效果实现代码
Jul 03 Javascript
jQuery Deferred和Promise创建响应式应用程序详细介绍
Mar 05 Javascript
鼠标事件的screenY,pageY,clientY,layerY,offsetY属性详解
Mar 12 Javascript
实例详解JavaScript获取链接参数的方法
Jan 01 Javascript
浅谈jquery中next与siblings的区别
Oct 27 Javascript
JS基于递归实现倒计时效果的方法
Nov 26 Javascript
easyui combotree加载静态数据问题(选不上)解决方法
Dec 26 Javascript
JavaScript使用链式方法封装jQuery中CSS()方法示例
Apr 07 jQuery
jQuery实现简单的抽奖游戏
May 05 jQuery
微信小程序 开发MAP(地图)实例详解
Jun 27 Javascript
vue-router 源码实现前端路由的两种方式
Jul 02 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
PHP完整的日历类(CLASS)
2006/11/27 PHP
PHP4 与 MySQL 数据库操作函数详解
2006/12/06 PHP
php广告加载类用法实例
2014/09/23 PHP
php+ajax无刷新分页实例详解
2015/12/07 PHP
PHP Curl模拟登录微信公众平台、新浪微博实例代码
2016/01/28 PHP
PHP6连接SQLServer2005的三部曲
2016/04/15 PHP
PHP实现JS中escape与unescape的方法
2016/07/11 PHP
使用ThinkPHP的自动完成实现无限级分类实例详解
2016/09/02 PHP
动态表单验证的操作方法和TP框架里面的ajax表单验证
2017/07/19 PHP
php中的钩子理解及应用实例分析
2019/08/30 PHP
jQuery bind事件使用详解
2011/05/05 Javascript
js中各种类型的变量在if条件中是true还是false
2014/07/16 Javascript
nodejs教程之制作一个简单的文章发布系统
2014/11/21 NodeJs
简单实现限制uploadify上传个数
2015/11/16 Javascript
原生和jQuery的ajax用法详解
2017/01/23 Javascript
Vue-resource拦截器判断token失效跳转的实例
2017/10/27 Javascript
JS实现的tab页切换效果完整示例
2018/12/18 Javascript
使用python在校内发人人网状态(人人网看状态)
2014/02/19 Python
Python简单实现安全开关文件的两种方式
2016/09/19 Python
Python3使用SMTP发送带附件邮件
2020/06/16 Python
Python 字符串与数字输出方法
2018/07/16 Python
Python selenium根据class定位页面元素的方法
2019/02/26 Python
Python 数据可视化pyecharts的使用详解
2019/06/26 Python
详解Python中的各种转义符\n\r\t
2019/07/10 Python
Python 余弦相似度与皮尔逊相关系数 计算实例
2019/12/23 Python
python实现的Iou与Giou代码
2020/01/18 Python
python3+opencv生成不规则黑白mask实例
2020/02/19 Python
matplotlib相关系统目录获取方式小结
2021/02/03 Python
Html5元素及基本语法详解
2016/08/02 HTML / CSS
中学校庆方案
2014/03/17 职场文书
中学生评语大全
2014/04/18 职场文书
毕业生应聘求职信
2014/07/10 职场文书
2014年学校团委工作总结
2014/12/20 职场文书
企业法人代表证明书
2015/06/18 职场文书
Pytest中skip和skipif的具体使用方法
2021/06/30 Python
Android开发 使用文件储存的方式保存QQ密码
2022/04/24 Java/Android