巧妙运用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 发个判断字符串是否为符合标准的函数
Apr 27 Javascript
javascript 闭包
Sep 15 Javascript
javascript是怎么继承的介绍
Jan 05 Javascript
深入理解JavaScript系列(6):S.O.L.I.D五大原则之单一职责SRP
Jan 15 Javascript
js登录弹出层特效
Mar 07 Javascript
JavaScript获得表单target属性的方法
Apr 02 Javascript
jQuery实现html表格动态添加新行的方法
May 28 Javascript
学习Angularjs分页指令
Jul 01 Javascript
JS实现DIV高度自适应窗口示例
Feb 16 Javascript
vue引入swiper插件的使用实例
Jul 19 Javascript
EasyUI创建人员树的实例代码
Sep 15 Javascript
vue.js整合mint-ui里的轮播图实例代码
Dec 27 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,ASP.JAVA,JAVA代码格式化工具整理
2010/06/15 PHP
简单的移动设备检测PHP脚本代码
2011/02/19 PHP
PHP学习之正则表达式
2011/04/17 PHP
PHP获取文件的MD5值并判断是否被修改的例子
2014/06/19 PHP
ThinkPHP模板输出display用法分析
2014/11/26 PHP
教大家制作简单的php日历
2015/11/17 PHP
php获取当前页面完整URL地址
2015/12/30 PHP
thinkPHP3.2.3结合Laypage实现的分页功能示例
2018/05/28 PHP
PHP ElasticSearch做搜索实例讲解
2020/02/05 PHP
JQuery中如何传递参数如click(),change()等具体实现
2013/04/28 Javascript
js中Math之random,round,ceil,floor的用法总结
2013/12/26 Javascript
Bootstrap框架安装使用详解
2017/01/21 Javascript
JS实现多级菜单中当前菜单不随页面跳转样式而发生变化
2017/05/30 Javascript
详解Angular Reactive Form 表单验证
2017/07/06 Javascript
ES6解构赋值实例详解
2017/10/31 Javascript
javascript前端和后台进行数据交互方法示例
2020/08/07 Javascript
在Python中处理XML的教程
2015/04/29 Python
python flask 多对多表查询功能
2017/06/25 Python
Python实现购物系统(示例讲解)
2017/09/13 Python
Python3操作Excel文件(读写)的简单实例
2019/09/02 Python
HTML5自定义属性的问题分析
2019/08/16 HTML / CSS
Expedia韩国官网:亚洲发展最快的在线旅游门户网站
2018/02/26 全球购物
ONLY瑞典官网:世界知名服装品牌
2018/06/19 全球购物
eBay瑞士购物网站:eBay.ch
2018/12/24 全球购物
计算机毕业大学生推荐信
2013/12/01 职场文书
大学生最常用的自我评价
2013/12/07 职场文书
车间统计员岗位职责
2014/01/05 职场文书
食品行业求职人的自我评价
2014/01/19 职场文书
宣传策划类求职信范文
2014/01/31 职场文书
早会主持词
2014/03/17 职场文书
高中课程设置方案
2014/05/28 职场文书
学习三严三实心得体会
2014/10/13 职场文书
拾金不昧表扬稿
2015/01/16 职场文书
Python 类,对象,数据分类,函数参数传递详解
2021/09/25 Python
高性能跳频抗干扰宽带自组网电台
2022/02/18 无线电
MySQL 数据 data 基本操作
2022/05/04 MySQL