巧妙运用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 removeChild()删除节点及删除子节点的方法
Dec 27 Javascript
使用ajaxfileupload.js实现上传文件功能
Aug 13 Javascript
javascript实现简单的on事件绑定
Aug 23 Javascript
利用jquery获取select下拉框的值
Nov 23 Javascript
Angular如何引入第三方库的方法详解
Jul 13 Javascript
JavaScript门面模式详解
Oct 19 Javascript
通过一次报错详细谈谈Point事件
May 17 Javascript
JS解析后台返回的JSON格式数据实例
Aug 06 Javascript
Node.js Event Loop各阶段讲解
Mar 08 Javascript
node实现socket链接与GPRS进行通信的方法
May 20 Javascript
React传值 组件传值 之间的关系详解
Aug 26 Javascript
解决vue打包报错Unexpected token: punc的问题
Oct 24 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中10个不常见却非常有用的函数
2010/03/21 PHP
解析PHP中的内存管理,PHP动态分配和释放内存
2013/06/28 PHP
PHP过滤黑名单关键字的方法
2014/12/01 PHP
驱动事件的addEvent.js代码
2007/03/27 Javascript
Extjs学习笔记之五 一个小细节renderTo和applyTo的区别
2010/01/07 Javascript
jquery遍历筛选数组的几种方法和遍历解析json对象
2013/12/13 Javascript
浅谈关于JavaScript API设计的一些建议和准则
2015/06/24 Javascript
详解Document.Cookie
2015/12/25 Javascript
jquery ztree异步搜索(搜叶子)实践
2016/02/25 Javascript
AngularJS 表达式详解及实例代码
2016/09/14 Javascript
浅谈javascript的闭包
2017/01/23 Javascript
Vue中$refs的用法详解
2018/06/24 Javascript
详解ES6系列之私有变量的实现
2018/11/21 Javascript
浏览器事件循环与vue nextTicket的实现
2019/04/16 Javascript
微信公众平台 发送模板消息(Java接口开发)
2019/04/17 Javascript
nodejs实现日志读取、日志查找及日志刷新的方法分析
2019/05/20 NodeJs
Vue路由守卫之路由独享守卫
2019/09/25 Javascript
解决Vue 给mapState中定义的属性赋值报错的问题
2020/06/22 Javascript
Python编码时应该注意的几个情况
2013/03/04 Python
Python中使用PDB库调试程序
2015/04/05 Python
python中字符串前面加r的作用
2015/06/04 Python
python实现文本去重且不打乱原本顺序
2016/01/26 Python
Anaconda2下实现Python2.7和Python3.5的共存方法
2018/06/11 Python
Python中super函数用法实例分析
2019/03/18 Python
Python 通过截图匹配原图中的位置(opencv)实例
2019/08/27 Python
python读取tif图片时保留其16bit的编码格式实例
2020/01/13 Python
python GUI库图形界面开发之PyQt5浏览器控件QWebEngineView详细使用方法
2020/02/26 Python
Python 列表推导式需要注意的地方
2020/10/23 Python
python通过cython加密代码
2020/12/11 Python
美国购买当代和现代家具网站:MODTEMPO
2018/07/20 全球购物
PHP如何设置和取得Cookie值
2015/06/30 面试题
描述内存分配方式以及它们的区别
2016/10/15 面试题
公积金单位接收函
2014/01/11 职场文书
优秀班干部事迹材料
2014/01/26 职场文书
2015年班组建设工作总结
2015/05/13 职场文书
python制作图形界面的2048游戏, 基于tkinter
2021/04/06 Python