巧妙运用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实现全屏漂浮广告移入光标停止移动
Dec 02 Javascript
js左右弹性滚动对联广告代码分享
Feb 19 Javascript
javascript的函数作用域
Nov 12 Javascript
angularJS结合canvas画图例子
Feb 09 Javascript
JS实现网页标题栏显示当前时间和日期的完整代码
Nov 02 Javascript
详解JavaScript逻辑Not运算符
Dec 04 Javascript
bootstrap 下拉多选框进行多选传值问题代码分析
Feb 14 Javascript
详解AngularJS controller调用factory
May 19 Javascript
Mac系统下Webstorm快捷键整理大全
May 28 Javascript
vue通过video.js解决m3u8视频播放格式的方法
Jul 30 Javascript
layui 上传文件_批量导入数据UI的方法
Sep 23 Javascript
插件导致ECharts被全量引入的坑示例解析
Sep 23 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中判断一个请求是ajax请求还是普通请求的方法
2011/06/28 PHP
PHP实现上一篇下一篇的方法实例总结
2016/09/22 PHP
URL编码转换,escape() encodeURI() encodeURIComponent()
2006/12/27 Javascript
RGB颜色值转HTML十六进制(HEX)代码的JS函数
2009/04/25 Javascript
node.js中的fs.ftruncate方法使用说明
2014/12/15 Javascript
js实现屏幕自适应局部代码分享
2015/01/30 Javascript
jQuery中大家不太了解的几个方法
2015/03/04 Javascript
javascript多物体运动实现方法分析
2016/01/08 Javascript
input点击后placeholder中的提示消息消失
2016/01/15 Javascript
WordPress 单页面上一页下一页的实现方法【附代码】
2016/03/10 Javascript
jQuery使用DataTable实现删除数据后重新加载功能
2017/02/27 Javascript
基于vue2实现上拉加载功能
2017/11/28 Javascript
jQuery第一次运行页面默认触发点击事件的实例
2018/01/10 jQuery
element-ui 的el-button组件中添加自定义颜色和图标的实现方法
2018/10/26 Javascript
angularjs模态框的使用代码实例
2019/12/20 Javascript
Vue双向绑定实现原理与方法详解
2020/05/07 Javascript
Element Card 卡片的具体使用
2020/07/26 Javascript
[01:16:50]DOTA2-DPC中国联赛 正赛 Phoenix vs CDEC BO3 第一场 3月7日
2021/03/11 DOTA
Python语言的12个基础知识点小结
2014/07/10 Python
跟老齐学Python之传说中的函数编写条规
2014/10/11 Python
Python MySQLdb 使用utf-8 编码插入中文数据问题
2018/03/13 Python
Python列表对象实现原理详解
2019/07/01 Python
python获取array中指定元素的示例
2019/11/26 Python
Django 自定义权限管理系统详解(通过中间件认证)
2020/03/11 Python
python读写数据读写csv文件(pandas用法)
2020/12/14 Python
Joules官网:女士、男士和儿童服装和鞋类
2018/10/23 全球购物
静态变量和实例变量的区别
2015/07/07 面试题
广告学专业应届生求职信
2013/10/01 职场文书
经典演讲稿范文
2013/12/30 职场文书
领导视察欢迎词
2014/01/15 职场文书
2014五一国际劳动节活动总结范文
2014/04/14 职场文书
美化环境标语
2014/06/20 职场文书
2014村党支部书记党建工作汇报材料
2014/11/02 职场文书
2014年安置帮教工作总结
2014/12/11 职场文书
谁动了我的奶酪读书笔记
2015/06/30 职场文书
创业计划书之蛋糕店
2019/08/29 职场文书