巧妙运用v-model实现父子组件传值的方法示例


Posted in Javascript onApril 07, 2019

v-model介绍

熟悉Vue的小伙伴们都知道 v-model 是Vue的一个很大的特色,可以实现双向数据绑定。但本质上呢,它不过是语法糖,它负责监听用户的输入事件以更新数据。
以下摘取自Vue官方文档

v-model 在内部使用不同的属性为不同的输入元素并抛出不同的事件:

  • text 和 textarea 使用 value 属性和 input 事件;
  • checkbox 和 radio 使用 checked 属性和 change 事件;
  • select 字段将 value 作为 prop 并将 change 作为事件。

如何巧妙利用 v-model实现父子组件传值

通常子组件某个变量更新,并需要告知父组件时,需要子组件触发事件并父组件监听该事件。

但是熟悉上面 v-model 的实现原理后,我们可以巧妙地运用这一原理(v-model 在内部使用不同的属性为不同的输入元素并抛出不同的事件)。

方法总结:

1.子组件设 value 为props属性,并且不主动改变 value 值
2.子组件通过 this.$emit('input', 'updateValue') 将 updateValue 值传给父组件
3.父组件通过 v-model="localValue" 绑定一个本地变量,即可实现子组件value值与父组件updateValue 值同步更新

举例

子组件

子组件,包含一个button,并且将 value 属性设为props( 因为v-model使用的是 value属性 )。

点击button时,sum值加1,同时通过 this.$emit('input', ++sum) 将更新后的值传给父组件(前提:传给父组件的值一定是你想赋给 value 的)

<template>
 <div>
  <button @click="increase" style="border: 1px solid black">increase</button>
 </div>
</template>
<script>
let sum = 0
export default {
 name: 'vmodel',
 props: {
  value: {
   type: Number,
   default: 0
  }
 },
 methods: {
  increase () {
   this.$emit('input', ++sum)
   console.log('value1', this.value)
  
   setTimeout(() => {
    console.log('value2', this.value)
   }, 50)
  }
 }
}
</script>

父组件

父组件中,通过 v-model 绑定一个本地变量,即可实现子父组件同步更新

<div>
  <increase v-model="rangeValue"></increase>
  <p>value:{{rangeValue}}</p>
</div>
<script>
data () {
  return {
   rangeValue: 0
  }
}
</script>

实际上,这个过程是首先子组件通过 $emit('input') 更新父组件的本地变量,然后子组件中的 value 属性通过 props 得以更新

总结

这种方式尤其适合子父组件传参的情况(子父组件同步更新)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JS 统计时间
Mar 09 Javascript
基于Jquery的标签智能验证实现代码
Dec 27 Javascript
javascript拖拽效果延伸学习
Apr 04 Javascript
浅析jQuery 3.0中的Data
Jun 14 Javascript
jquery+ajax+text文本框实现智能提示完整实例
Jul 09 Javascript
浅析JavaScriptSerializer类的序列化与反序列化
Nov 22 Javascript
Vue表单验证插件Vue Validator使用方法详解
Apr 07 Javascript
AngularJS 最常用的八种功能(基础知识)
Jun 26 Javascript
JavaScript实现的超简单计算器功能示例
Dec 23 Javascript
关于微信公众号开发无法支付的问题解决
Dec 28 Javascript
详解新手使用vue-router传参时注意事项
Jun 06 Javascript
js校验开始时间和结束时间
May 26 Javascript
vue路由导航守卫和请求拦截以及基于node的token认证的方法
Apr 07 #Javascript
vue自定义指令directive的使用方法
Apr 07 #Javascript
浅谈express.js框架中间件(middleware)
Apr 07 #Javascript
详解vue中this.$emit()的返回值是什么
Apr 07 #Javascript
浅谈javascript中的prototype和__proto__的理解
Apr 07 #Javascript
javascrit中undefined和null的区别详解
Apr 07 #Javascript
详解服务端预渲染之Nuxt(介绍篇)
Apr 07 #Javascript
You might like
PHP中break及continue两个流程控制指令区别分析
2011/04/18 PHP
不支持fsockopen但支持culr环境下下ucenter与modoer通讯问题
2011/08/12 PHP
改写ThinkPHP的U方法使其路由下分页正常
2014/07/02 PHP
PHP使用NuSOAP调用Web服务的方法
2015/07/18 PHP
laravel Task Scheduling(任务调度)在windows下的使用详解
2019/10/22 PHP
SharePoint 客户端对象模型 (一) ECMA Script
2011/05/22 Javascript
JavaScript中的方法重载实例
2015/03/16 Javascript
JavaScript中计算网页中某个元素的位置
2015/06/10 Javascript
基于Jquery+div+css实现弹出登录窗口(代码超简单)
2015/10/27 Javascript
JS实现的简单鼠标跟随DiV层效果完整实例
2015/10/31 Javascript
jquery中实现时间戳与日期相互转换
2016/04/12 Javascript
Bootstrap Validator 表单验证
2016/07/25 Javascript
分享JavaScript监听全部Ajax请求事件的方法
2016/08/28 Javascript
JavaScript中关键字 in 的使用方法详解
2016/10/17 Javascript
jquery对象和DOM对象的相互转换详解
2016/10/18 Javascript
angular ngClick阻止冒泡使用默认行为的方法
2016/11/03 Javascript
谈谈JS中常遇到的浏览器兼容问题和解决方法
2016/12/17 Javascript
Bootstrap fileinput文件上传组件使用详解
2017/06/06 Javascript
Vue渲染过程浅析
2019/03/14 Javascript
VUE实现图片验证码功能
2020/11/18 Javascript
vue 调用 RESTful风格接口操作
2020/08/11 Javascript
JavaScript实现网页留言板功能
2020/11/23 Javascript
Python SQLAlchemy基本操作和常用技巧(包含大量实例,非常好)
2014/05/06 Python
Python实现的直接插入排序算法示例
2018/04/29 Python
树莓派实现移动拍照
2019/06/22 Python
python图像处理模块Pillow的学习详解
2019/10/09 Python
浅谈PyQt5中异步刷新UI和Python多线程总结
2019/12/13 Python
如何基于python操作excel并获取内容
2019/12/24 Python
大学本科毕业生的自我鉴定范文
2013/11/19 职场文书
党员自我评价分享
2013/12/13 职场文书
物流专业大学生职业生涯规划书范文
2014/01/15 职场文书
《只有一个地球》教学反思
2014/02/14 职场文书
原材料检验岗位职责
2014/03/15 职场文书
家长会学生演讲稿
2014/04/26 职场文书
浅谈MySQL next-key lock 加锁范围
2021/06/07 MySQL
JS前端宏任务微任务及Event Loop使用详解
2022/07/23 Javascript