概述

常见使用场景可以分为三类:

  • 父子通信:

    • 父向子传递数据是通过 props
    • 子向父是通过 events( $emit )
    • 通过父链 / 子链也可以通信( $parent / $children )
    • ref 也可以访问组件实例;provide / inject API。
  • 兄弟通信:Bus;Vuex;
  • 跨级通信:Bus;Vuex;provide / inject API、 a t t r s / attrs/ attrs/listeners

props/$emit

父组件中的数据在子组件中不能直接使用,要想在子组件中使用,步骤:
1、 父组件中调用子组件时绑定动态属性
2、 子组件中通过props接收父组件中传递过来的数据
3、 在子组件中使用

示例:父组件向子组件传递数据

  • 子组件
<template><div><h1>子组件</h1><h3>插值表达式获取到:{{msg1}}</h3><h3>插值表达式获取到:{{msg2}}</h3><h3>插值表达式获取到:{{msg3}}</h3></div>
</template>
<script>export default {name: 'Child',props: ['msg1', 'msg2', 'msg3']}
</script>
  • 父组件:
<template><div><h1>父组件</h1><h-child v-bind:msg1="'来自父组件的数据'"    动态绑定:msg2="'data from parent'"   动态绑定的简写形式msg3="'data from parent'"   绑定字符串></h-child></div>
</template>
<script>// 引入子组件import HChild from './Child'export default {name: 'Parent',components: {HChild}}
</script>

结果:

在子组件中使用props除了可以获取父组件的值之外,还可以验证父组件传递到子组件的数据的合法性,还可以获取父组件本身或者调用父组件中的方法。
示例:父组件向子组件传递数据

  • 父组件
<template><div><h1>父组件</h1><h-child v-bind:msg="'来自父组件的数据'"      绑定数据:pfun="fun"              绑定方法:pComp=this                绑定对象></h-child></div>
</template>
<script>// 引入子组件import HChild from './Child'export default {name: 'Parent',components: {HChild},methods: {fun () {console.log('parent fun')}}}
</script>
  • 子组件
<template><div><h1>子组件</h1><h3>插值表达式获取到:{{msg}}</h3><button @click="pfun">调用父组件的方法</button><br><button @click="cfun">获取父组件</button></div>
</template>
<script>export default {name: 'Child',props: {msg: {type: String,default: ''},pfun: {type: Function},pComp: {type: Object}},methods: {cfun () {console.log(this.pComp)
this.pComp.fun()}}}
</script>
  • 结果

示例:子组件向父组件传递数据
子组件向父组件传值一般通过事件触发实现。

  • 子组件
<template><div><h1>子组件</h1><button @click="passMsg">子组件向父组件传值</button></div>
</template>
<script>export default {name: 'Child',methods: {passMsg () {this.$emit('showMsgEvent', '子组件向父组件传递的值')}}}
</script>
  • 父组件
<template><div><h1>父组件</h1><h3>插值表达式获取到:{{msg}}</h3><h-child  @showMsgEvent="showMsg"></h-child></div>
</template>
<script>// 引入子组件import HChild from './Child'export default {name: 'Parent',data () {return {msg: ''}},components: {HChild},methods: {showMsg (val) {this.msg = val}}}
</script>

结果:

单击按钮后

$parent/children

p a r e n t s 是当前组件树的根 V u e 实例。如果当前实例没有父实例,此实例将会是其自己。既然可以获取到组件的实例,那么就可以调用组件的属性或是方法进行操作。换句话说即 p a r e n t s 让我们可以在子组件中访问到父组件的 d a t a 和方法。具体语法为: t h i s . parents是当前组件树的根 Vue 实例。如果当前实例没有父实例,此实例将会是其自己。 既然可以获取到组件的实例,那么就可以调用组件的属性或是方法进行操作。换句话说即parents让我们可以在子组件中访问到父组件的data和方法。具体语法为: this. parents是当前组件树的根Vue实例。如果当前实例没有父实例,此实例将会是其自己。既然可以获取到组件的实例,那么就可以调用组件的属性或是方法进行操作。换句话说即parents让我们可以在子组件中访问到父组件的data和方法。具体语法为:this.parent.数据
this.$parent.方法

示例:父组件向子组件传值:子组件主动获取父组件的数据和方法
  • 父组件:
<template><div><h1>父组件</h1><h-child></h-child></div>
</template>
<script>// 引入子组件import HChild from './Child'export default {name: 'Parent',components: {HChild},data () {return {msg: 'data from parent'}},methods: {fun () {console.log('parent fun')}}}
</script>
  • 子组件:
<template><div><h1>子组件</h1><button @click="showParent">调用父组件的数据和方法</button></div>
</template>
<script>export default {name: 'Child',methods: {showParent () {// 获取到所有的子组件console.log(this.$parent)// 获取指定子组件中的指定数据console.log(this.$parent.msg)// 调用子组件的方法this.$parent.fun()}}}
</script>

注意:子组件获取父组件中的数据的方法的代码不能直接写在钩子函数mounted中。
结果:

示例:子组件向父组件传值

  • 子组件:
<template><div><h1>子组件</h1></div>
</template>
<script>export default {name: 'Child',data () {return {msg: 'msg from child'}},methods: {fun () {console.log('child fun')}}}
</script>
  • 父组件:
<template><div><h1>父组件</h1><h-child></h-child></div>
</template>
<script>// 引入子组件import HChild from './Child'export default {name: 'Parent',components: {HChild},mounted () {// 获取到所有的子组件,结果是一个数组console.log(this.$children)// 获取指定子组件中的指定数据console.log(this.$children[0].msg)// 调用子组件的方法this.$children[0].fun()}}
</script>

注意:

  • $children并不保证顺序,也不是响应式的。使用 $children 来进行数据绑定时,可以考虑使用一个数组配合 v-for 来生成子组件,并且使用 Array 作为真正的来源
  • $children 是一个数组,是直接儿子的集合,儿子里面有个 _uid 属性,可以知道它是第几个元素,_uid是元素的唯一标识符,根据这个属性,我们可以进行其他的操作
    结果

$ref:父组件主动获取子组件的数据和方法

$refs 让我们可以在父组件中进行操作子组件的数据以及方法,使用步骤:

  1. 在父组件中调用子组件时定义一个ref
  2. 在父组件中通过this.$refs.<ref中定义的子组件名>.属性/方法

示例:子组件向父组件传值:

  • 子组件:
<template><div><h1>子组件</h1></div>
</template>
<script>export default {name: 'Child',data () {return {msg: 'msg from child'}},methods: {fun () {console.log('child fun')}}}
</script>
  • 父组件:
<template><div><h1>父组件</h1><h-child ref="children"></h-child></div>
</template>
<script>// 引入子组件import HChild from './Child'export default {name: 'Parent',data () {return {msg: 'data from parent'}},components: {HChild},mounted () {// 获取到所有的子组件,结果是一个对象console.log(this.$refs.children)// 获取指定子组件中的指定数据console.log(this.$refs.children.msg)// 调用子组件的方法this.$refs.children.fun()}}
</script>

结果

兄弟组件之间传值

原理事件广播方式,步骤:
1、 新建一个js文件,然后引入vue并实例化,最后暴露这个实例
2、 在广播和接收广播的组件中都引入上步中定义的实例
3、 通过 e m i t ( ) 广播数据 4 、通过 emit()广播数据 4、 通过 emit()广播数据4、通过on()接收数据

示例:

  • App.vue
<template><div id="app"><v-home></v-home><v-news></v-news></div>
</template>
<script>import Home from './views/Home';import News from './views/News';export default {name: 'app',components:{'v-home':Home,'v-news':News}}
</script>
  • 在src/utils目录中创建bus.js文件,代码如下:
import Vue from 'vue';  //1、引入一个空的Vue实例
export default new Vue();   //2、实例化Vue实例并暴露出去
  • Home.vue
<template><div><h2> Home首页 </h2><br><button @click="broadcast2News">给News广播数据</button></div>
</template>
<script>import bus from '../utils/bus'export default {methods: {broadcast2News(){//广播数据bus.$emit('data2news', '来自Home的数据');}}}
</script>
  • News.vue
<template><div><h2> News头部</h2><br></div>
</template>
<script>import bus from '../src/bus'export default {mounted(){bus.$on('data2news',function (shuJu) {console.log(shuJu);});}}
</script>

结果:

a t t r s / attrs/ attrs/listeners:多级组件间传值

  • $attrs:将父组件中不包含props的属性传入子组件,通常配合interitAttrs选项一起使用
  • $listeners:监听子组件中数据的变化,传递给父组件

示例:$attrs
第一步:App.vue

<template><div id="app"><h2>最外层组件</h2><!-- 统一传值 --><v-parent :msgA="msg1" :msgB="msg2" :msgC="msg3"></v-parent></div>
</template>
<script>// 引入子组件import Parent from './views/Parent'export default {name: 'Parent',components: {'v-parent': Parent},data () {return {msg1: 'aaaaa',msg2: 'bbbbb',msg3: 'ccccc'}}}
</script>

第二步:Parent.vue

<template><div><h2>中间组件</h2><h-child v-bind="$attrs"></h-child></div>
</template>
<script>// 引入子组件import HChild from './Child'export default {name: 'Parent',components: {HChild}}
</script>

第三步:Child.vue

<template><div><h2> 数据接收方 </h2><br></div>
</template>
<script>export default {mounted () {console.log(this.$attrs)}}
</script>

结果:

VUE2 组件间传值相关推荐

  1. 六十三、Vue中非父子(兄弟)组件间传值,插槽的使用和作用域插槽(非常重要)

    2020/10/18 . 周日.今天又是奋斗的一天. @Author:Runsen @Date:2020/10/18 写在前面:我是「Runsen」,热爱技术.热爱开源.热爱编程.技术是开源的.知识是 ...

  2. Vue2组件间通信——父传子值props

    Vue2组件间通信--父传子值props Vue2中组件间通信系列,本篇是关于父组件向子组件传值的介绍,这里我会用通俗的语言帮助大家理解props配置项 功能: 子组件可以接收到父组件传递的数据信息, ...

  3. Vue组件间传值详解

    文章目录 1. 父组件向子组件传值 1.1 描述 1.2 props接收数据: 2. 子组件向父组件传值 3. 兄弟组件间传值 4. 事件总线 5. Ref 6. root/parent/childr ...

  4. 组件间数据交互——父组件向子组件传值( props属性值类型) 子组件向父组件传值-携带参数 || 非父子组件间传值

    父组件向子组件传值 <!DOCTYPE html> <html lang="en"> <head><meta charset=" ...

  5. 简单教你React父子组件间平级组件间传值

    国庆充电特辑: 堵车堵死,废话不多说直接上菜. 1.父组件对子组件传值 利用props属性传值 class Component extends React.Component {constructor ...

  6. vue 组件间传值、兄弟组件 、bus方式 ( 1 分钟看懂 )

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. bus方式的组件间传值其实就是建立一个公共的js文件,专门用来传递消息 1.建立公共文件,并引入 新 ...

  7. vue项目原理分析-1:组件间传值

    整个项目目录(create project后) vue.config.js的配置 // vue.config.js 常⽤配置 module.exports = {devServer:{port:333 ...

  8. vue向ifarm传值_vue组件间传值

    目前流行组件化开发,vue组件间传值是一个非常常用的功能,有时候仅仅是父子和兄弟之间简单的传值,我们就没有必要直接引入vuex来进行管理. # 1.父子间传值 ## 1.1 子组件向父组件传值 子组件 ...

  9. vue组件间传值的六种方法

    一. vue组件间传值 1. 父组件向子组件进行传值props 父组件代码: <template><div>父组件:<input type="text" ...

最新文章

  1. React Native——react-navigation的使用
  2. 关于运算符operator重载出错解决方法
  3. BZOJ-2716-天使玩偶angel-CDQ分治
  4. mysql 增量备份_MySQL增量备份与恢复(增量备份概述、特点,断点恢复实操)
  5. 明晚直播丨基于IB网络的Oracle Extend RAC最佳实践
  6. 宏定义 object-c 单例
  7. vue 背景透明度_Visual Studio 2017 设置透明背景图
  8. 5.大数据架构详解:从数据获取到深度学习 --- 流处理
  9. 8.GitLab 里程碑
  10. 苹果手机网页上点击数字可能拨打电话的解决办法
  11. PhotoShop 橡皮擦工具组、渐变工具
  12. 《企业管理学》管理理论的产生于发展知识点总结
  13. otl c mysql_OTL
  14. python课程设计——当当网Python图书数据分析
  15. html-css10 过渡/米兔练习/动画/动画练习/小球动画/平移和小米移动图
  16. 何恺明新作来了!更快更有效的训练FLIP
  17. windows平台基础工作软件整理【持续更新】
  18. 带你手摸手搭建vuepress站点
  19. 【考】数据库原理与技术 数据查询
  20. [论文学习]A Survey on Transfer Learning

热门文章

  1. Python图像处理,cv2模块,OpenCV实现检索图片
  2. MPCS-341 3A 光电耦合器 用于IGBT/MOSFET隔离栅极驱动 完美代替TLP5754
  3. (附源码)APP+springboot垃圾自动分类管理系统 毕业设计 160846
  4. C 语言项目中.h文件和.c文件的关系
  5. 持续集成:Jenkins Pipeline共享库定义和使用
  6. linux常用bash命令介绍
  7. 嵌入式系统常用词汇统计表
  8. Python-pydicom读取dcm文件报错-2021.6.5
  9. 【数据分析】—— 指标与指标体系
  10. php花朵飘落特效,【新年气象】WordPress 主题添加花瓣飘落特效