巧妙运用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 相关文章推荐
jquery 查找新建元素代码
Jul 06 Javascript
javascript使用定时函数实现跳转到某个页面
Dec 25 Javascript
jQuery插件实现无缝滚动特效
Nov 24 Javascript
理解javascript闭包
Dec 15 Javascript
Bootstrap源码解读网格系统(3)
Dec 22 Javascript
jQuery插件HighCharts绘制2D带有Legend的饼图效果示例【附demo源码下载】
Mar 10 Javascript
vuejs+element-ui+laravel5.4上传文件的示例代码
Aug 12 Javascript
BootStrap给table表格的每一行添加一个按钮事件
Sep 07 Javascript
解决axios发送post请求返回400状态码的问题
Aug 11 Javascript
javascript使用substring实现的展开与收缩文字功能示例
Jun 17 Javascript
解决vue+webpack项目接口跨域出现的问题
Aug 10 Javascript
vue+echarts实现多条折线图
Mar 21 Vue.js
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
全国FM电台频率大全 - 28 甘肃省
2020/03/11 无线电
聊天室php&amp;mysql(三)
2006/10/09 PHP
PHP Error与Logging函数的深入理解
2013/06/03 PHP
php生成年月日下载列表的方法
2015/04/24 PHP
PHP图像裁剪缩略裁切类源码及使用方法
2016/01/07 PHP
HTML页面如何象ASP一样接受参数
2007/02/07 Javascript
javascript Base类 包含基本的方法
2009/07/22 Javascript
关于js拖拽上传 [一个拖拽上传修改头像的流程]
2011/07/13 Javascript
js multiple全选与取消全选实现代码
2012/12/04 Javascript
document.documentElement和document.body区别介绍
2013/09/16 Javascript
Node调试工具JSHint的安装及配置教程
2014/05/27 Javascript
基于jQuery+JSON的省市二三级联动效果
2015/06/05 Javascript
JavaScript实现获得所有兄弟节点的方法
2015/07/23 Javascript
jquery实现横向图片轮播特效代码分享
2015/11/19 Javascript
js实现简单的计算器功能
2017/01/16 Javascript
Bootstrap 3浏览器兼容性问题及解决方案
2017/04/11 Javascript
node.js博客项目开发手记
2018/03/16 Javascript
详解原生JS回到顶部
2019/03/25 Javascript
ajax跨域访问遇到的问题及解决方案
2019/05/23 Javascript
javascript实现超好看的3D烟花特效
2020/01/01 Javascript
[37:21]完美世界DOTA2联赛PWL S2 Inki vs Magma 第二场 11.22
2020/11/24 DOTA
python使用smtplib模块通过gmail实现邮件发送的方法
2015/05/08 Python
简单学习Python time模块
2016/04/29 Python
Python的numpy库中将矩阵转换为列表等函数的方法
2018/04/04 Python
使用python画个小猪佩奇的示例代码
2018/06/06 Python
django搭建项目配置环境和创建表过程详解
2019/07/22 Python
解决Tensorflow2.0 tf.keras.Model.load_weights() 报错处理问题
2020/06/12 Python
Python的collections模块真的很好用
2021/03/01 Python
ProBikeKit英国:在线公路自行车之家
2017/02/10 全球购物
The North Face北面美国官网:美国著名户外品牌
2018/09/15 全球购物
小学美术教学反思
2014/02/01 职场文书
瘦西湖导游词
2015/02/03 职场文书
烈士陵园观后感
2015/06/08 职场文书
告知书格式
2015/07/01 职场文书
动漫APP软件排行榜前十名,半次元上榜,第一款由腾讯公司推出
2022/03/18 杂记
Java 超详细讲解IO操作字节流与字符流
2022/03/25 Java/Android