巧妙运用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 相关文章推荐
Javascript 修改String 对象 增加去除空格功能(示例代码)
Nov 30 Javascript
js获取当前路径的简单示例代码
Jan 08 Javascript
JS替换文本域内的回车示例
Feb 18 Javascript
js语法学习之判断一个对象是否为数组
May 13 Javascript
javascript学习笔记(一)基础知识
Sep 30 Javascript
在JavaScript中操作数组之map()方法的使用
Jun 09 Javascript
有关Promises异步问题详解
Nov 13 Javascript
深入理解React中es6创建组件this的方法
Aug 29 Javascript
node.js爬虫爬取拉勾网职位信息
Mar 14 Javascript
详解Vue的常用指令v-if, v-for, v-show,v-else, v-bind, v-on
Oct 12 Javascript
js校验开始时间和结束时间
May 26 Javascript
Vue js with语句原理及用法解析
Sep 03 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判断页面是否是微信打开的示例(微信打开网页)
2014/04/25 PHP
php 比较获取两个数组相同和不同元素的例子(交集和差集)
2019/10/18 PHP
jQuery提示效果代码分享
2014/11/20 Javascript
javascript实现输出指定行数正方形图案的方法
2015/08/03 Javascript
checkbox 选中一个另一个checkbox也会选中的实现代码
2016/07/09 Javascript
IntersectionObserver API 详解篇
2016/12/11 Javascript
Bootstrap源码解读标签、徽章、缩略图和警示框(8)
2016/12/26 Javascript
jQuery插件ajaxFileUpload使用详解
2017/01/10 Javascript
EasyUI Tree树组件无限循环的解决方法
2017/09/27 Javascript
浅谈Vue 数据响应式原理
2018/05/07 Javascript
js实现简单选项卡功能
2020/03/23 Javascript
详解json串反转义(消除反斜杠)
2019/08/12 Javascript
记一次react前端项目打包优化的方法
2020/03/30 Javascript
vue切换菜单取消未完成接口请求的案例
2020/11/13 Javascript
[06:07]辉夜杯现场观众互动 “比谁远送显示器”
2015/12/26 DOTA
[49:13]DOTA2上海特级锦标赛C组资格赛#1 OG VS LGD第一局
2016/02/27 DOTA
[01:16:37]【全国守擂赛】第三周决赛 Dark Knight vs. 一个弱队
2020/05/04 DOTA
python3使用requests模块爬取页面内容的实战演练
2017/09/25 Python
对python .txt文件读取及数据处理方法总结
2018/04/23 Python
python实现输入任意一个大写字母生成金字塔的示例
2019/10/27 Python
基于python实现蓝牙通信代码实例
2019/11/19 Python
Python3 assert断言实现原理解析
2020/03/02 Python
Python3开发环境搭建详细教程
2020/06/18 Python
django使用多个数据库的方法实例
2021/03/04 Python
html5 touch事件实现页面上下滑动效果【附代码】
2016/03/10 HTML / CSS
html5摇一摇代码优化包括DeviceMotionEvent等等
2014/09/01 HTML / CSS
美国女性奢华品牌精品店:INTERMIX
2017/10/12 全球购物
欧缇丽加拿大官方网站:Caudalie加拿大
2019/07/18 全球购物
逻辑链路控制协议
2016/10/01 面试题
品学兼优的大学生自我评价
2013/09/20 职场文书
如何写毕业求职自荐信
2013/11/06 职场文书
小学生演讲稿
2014/01/12 职场文书
国庆节文艺活动方案
2014/02/03 职场文书
物业总经理岗位职责
2014/02/28 职场文书
国贸专业的职业规划书
2014/03/15 职场文书
干部作风纪律整顿心得体会
2016/01/23 职场文书