浅析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的闭包
Dec 31 Javascript
Angularjs注入拦截器实现Loading效果
Dec 28 Javascript
理解javascript函数式编程中的闭包(closure)
Mar 08 Javascript
详解打造 Vue.js 可复用组件
Mar 24 Javascript
jquery Form轻松实现文件上传
May 24 jQuery
zTree异步加载展开第一级节点的实现方法
Sep 05 Javascript
Vuex 使用及简单实例(计数器)
Aug 29 Javascript
解决vue js IOS H5focus无法自动弹出键盘的问题
Aug 30 Javascript
原生js+ajax分页组件
Jan 30 Javascript
vue+Element-ui实现分页效果
Nov 15 Javascript
Vue组件生命周期运行原理解析
Nov 25 Vue.js
Vuex实现简单购物车
Jan 10 Vue.js
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
截获网站title标签之家内容的例子
2006/10/09 PHP
thinkphp视图模型查询提示ERR: 1146:Table 'db.pr_order_view' doesn't exist的解决方法
2014/10/30 PHP
php表单提交与$_POST实例分析
2015/01/26 PHP
科讯商业版中用到的ajax空间与分页函数
2007/09/02 Javascript
通过JS自动隐藏手机浏览器的地址栏实现原理与代码
2013/01/02 Javascript
JS中Iframe之间传值及子页面与父页面应用
2013/03/11 Javascript
jQuery 三击事件实现代码
2013/09/11 Javascript
jQuery中offsetParent()方法用法实例
2015/01/19 Javascript
JavaScript中toString()方法的使用详解
2015/06/05 Javascript
详解在vue-cli中使用路由
2017/09/25 Javascript
详解React Native 采用Fetch方式发送跨域POST请求
2017/11/15 Javascript
vue2.0 兄弟组件(平级)通讯的实现代码
2018/01/15 Javascript
关于TypeScript模块导入的那些事
2018/06/12 Javascript
微信小程序自定义tab实现多层tab嵌套功能
2018/06/15 Javascript
JavaScript中变量、指针和引用功能与操作示例
2018/08/04 Javascript
jQuery实现图片下载代码
2019/07/18 jQuery
vue 实现用户登录方式的切换功能
2020/04/14 Javascript
[46:27]DOTA2上海特级锦标赛主赛事日 - 1 胜者组第一轮#2LGD VS MVP.Phx第一局
2016/03/02 DOTA
[08:56]DOTA2-DPC中国联赛2月23日Recap集锦
2021/03/11 DOTA
python连接oracle数据库实例
2014/10/17 Python
python访问系统环境变量的方法
2015/04/29 Python
Python实现将绝对URL替换成相对URL的方法
2015/06/28 Python
Linux RedHat下安装Python2.7开发环境
2017/05/20 Python
Tensorflow环境搭建的方法步骤
2018/02/07 Python
python实现单向链表详解
2018/02/08 Python
详解Python网络框架Django和Scrapy安装指南
2019/04/01 Python
Python 继承,重写,super()调用父类方法操作示例
2019/09/29 Python
用openCV和Python 实现图片对比,并标识出不同点的方式
2019/12/19 Python
天猫超市:阿里巴巴打造的网上超市
2016/11/02 全球购物
英国知名的护肤彩妆与时尚配饰大型综合零售电商:Unineed
2016/11/21 全球购物
美国折扣宠物药房:Total Pet Supply
2018/05/27 全球购物
成教毕业生自我鉴定
2013/10/23 职场文书
群众对十八届四中全会的期盼
2014/10/17 职场文书
2015年关爱留守儿童工作总结
2015/05/22 职场文书
一定要知道的 25 个 Vue 技巧
2021/11/02 Vue.js
JavaScript中document.activeELement焦点元素介绍
2021/11/27 Javascript