浅析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 相关文章推荐
JQuery里面的几种选择器 查找满足条件的元素$(&quot;#控件ID&quot;)
Aug 23 Javascript
对于Form表单reset方法的新认识
Mar 05 Javascript
使用jquery实现放大镜效果
Sep 02 Javascript
JS表的模拟方法
Feb 05 Javascript
jQuery实现ajax调用WCF服务的方法(附带demo下载)
Dec 04 Javascript
使用Node.js处理前端代码文件的编码问题
Feb 16 Javascript
JavaScript中cookie工具函数封装的示例代码
Oct 11 Javascript
jquery.flot.js简单绘制折线图用法示例
Mar 13 Javascript
Vue.js仿Metronic高级表格(一)静态设计
Apr 17 Javascript
vue 指定组件缓存实例详解
Apr 01 Javascript
基于vue,vue-router, vuex及addRoutes进行权限控制问题
May 02 Javascript
vue实现codemirror代码编辑器中的SQL代码格式化功能
Aug 27 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加水印的代码(支持半透明透明打水印,支持png透明背景)
2013/01/17 PHP
PHP删除指定目录中的所有目录及文件的方法
2015/02/26 PHP
递归实现php数组转xml的代码分享
2015/05/14 PHP
php中smarty变量修饰用法实例分析
2015/06/11 PHP
php面向对象与面向过程两种方法给图片添加文字水印
2015/08/26 PHP
php封装的连接Mysql类及用法分析
2015/12/10 PHP
PHP实现bitmap位图排序与求交集的方法
2016/07/28 PHP
浅谈PHP接入(第三方登录)QQ登录 OAuth2.0 过程中遇到的坑
2017/10/13 PHP
分享5个非常有用的Laravel Blade指令
2018/05/30 PHP
PHP实现的62进制转10进制,10进制转62进制函数示例
2019/06/06 PHP
自动最大化窗口的Javascript代码
2013/05/22 Javascript
javascript中数组的冒泡排序使用示例
2013/12/18 Javascript
javascript动态判断html元素并执行不同的操作
2014/06/16 Javascript
动态的9*9乘法表效果的实现代码
2016/05/16 Javascript
浅析jquery unbind()方法移除元素绑定的事件
2016/05/24 Javascript
在一般处理程序(ashx)中弹出js提示语
2017/08/16 Javascript
浅谈webpack编译vue项目生成的代码探索
2017/12/11 Javascript
在Vue项目中使用d3.js的实例代码
2018/05/01 Javascript
node.js的http.createServer过程深入解析
2019/06/06 Javascript
解决layui的form里的元素进行动态生成,验证失效的问题
2019/09/14 Javascript
Vue常用的全选/反选的示例代码
2020/02/19 Javascript
Element InfiniteScroll无限滚动的具体使用方法
2020/07/27 Javascript
html+vue.js 实现漂亮分页功能可兼容IE
2020/11/07 Javascript
pygame游戏之旅 载入小车图片、更新窗口
2018/11/20 Python
python实现控制COM口的示例
2019/07/03 Python
基于python读取.mat文件并取出信息
2019/12/16 Python
使用python创建生成动态链接库dll的方法
2020/05/09 Python
什么是反射?如何实现反射?
2016/07/25 面试题
好的演讲稿开场白
2013/12/30 职场文书
大学毕业生自荐书怎么写?
2014/01/06 职场文书
留学顾问岗位职责
2014/04/14 职场文书
元旦联欢会策划方案
2014/06/11 职场文书
交通工程专业推荐信
2014/09/06 职场文书
担保书范文
2015/01/20 职场文书
五年级作文之成长
2019/09/16 职场文书
jquery插件实现图片悬浮
2021/04/16 jQuery