浅析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小技巧
Jul 21 Javascript
Javascript string 扩展库代码
Apr 09 Javascript
jQuery Autocomplete自动完成插件
Jul 17 Javascript
Extjs中使用extend(js继承) 的代码
Mar 15 Javascript
浅谈jQuery框架Ajax常用选项
Jul 08 jQuery
AngularJS中下拉框的基本用法示例
Oct 11 Javascript
js 毫秒转天时分秒的实例
Nov 17 Javascript
webpack公共组件引用路径简化小技巧
Jun 15 Javascript
Vue自定义指令写法与个人理解
Feb 09 Javascript
vue实现多条件和模糊搜索功能
May 28 Javascript
jenkins自动构建发布vue项目的方法步骤
Jan 04 Vue.js
使用原生javascript开发计算器实例代码
Feb 21 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
PHP5/ZendEngine2的改进
2006/10/09 PHP
PHP与MYSQL中UTF8 中文排序示例代码
2014/10/23 PHP
php获取错误信息的方法
2015/07/17 PHP
利用PHP访问MySql数据库的逻辑操作以及增删改查的实例讲解
2017/08/30 PHP
DOM相关内容速查手册
2007/02/07 Javascript
javascript 写的一个简单的timer
2009/07/30 Javascript
Mootools 1.2教程(21)——类(二)
2009/09/15 Javascript
js异步加载的三种解决方案
2013/03/04 Javascript
JS 实现获取打开一个界面中输入的值
2013/03/19 Javascript
JS保留两位小数,多位小数的示例代码
2014/01/07 Javascript
node.js中的fs.closeSync方法使用说明
2014/12/17 Javascript
jquery+json实现数据二级联动的方法
2015/11/28 Javascript
使用jquery提交form表单并自定义action的实现代码
2016/05/25 Javascript
原生 JS Ajax,GET和POST 请求实例代码
2016/06/08 Javascript
微信小程序 图片上传实例详解
2017/05/05 Javascript
使用Ajax和Jquery配合数据库实现下拉框的二级联动的示例
2018/01/25 jQuery
javascript中join方法实例讲解
2019/02/21 Javascript
JavaScript制作3D旋转相册
2020/08/02 Javascript
Python实现将不规范的英文名字首字母大写
2016/11/15 Python
Windows下安装Scrapy
2018/10/17 Python
Python 复平面绘图实例
2019/11/21 Python
如何通过Python3和ssl实现加密通信功能
2020/05/09 Python
基于Python把网站域名解析成ip地址
2020/05/25 Python
法国时尚童装网站:Melijoe
2016/08/10 全球购物
为女性购买传统的印度服装和婚纱:Kalkifashion
2019/07/22 全球购物
Laravel的加密解密与哈希实例讲解
2021/03/24 PHP
中职生自我鉴定范文
2013/10/03 职场文书
车祸赔偿收入证明
2014/01/09 职场文书
材料工程专业毕业生求职信
2014/03/04 职场文书
普通话宣传标语
2014/06/26 职场文书
个人委托书范本
2014/09/13 职场文书
行政人事主管岗位职责
2015/04/11 职场文书
2015年圣诞节寄语
2015/08/17 职场文书
幼儿园教师心得体会范文
2016/01/21 职场文书
Elasticsearch 基本查询和组合查询
2022/04/19 Python
JavaScript实现一键复制内容剪贴板
2022/07/23 Javascript