源码地址

点击查看演示源码

Vue2父子传参:props

首先在父组件中引入子组件,然后以属性的方式将数据传递给子组件

父组件:

<template>
<div class="home">
<!-- 在子组件中使用 :变量名=value 的方式向子组件传递数据,子组件通过 props 接收-->
<HelloWorld :msg="fatchData" ref="childEl"/>
</div>
</template> <script>
// @ is an alias to /src
import HelloWorld from '@/components/HelloWorld.vue' export default {
name: 'Home',
components: {
HelloWorld
},
data () {
return {
fatchData: '我是父组件通过props传递给子组件的文字'
}
}
}
</script>

然后在子组件中使用props接收,props里定义的名字要和父组件定义的一致

子组件:

<template>
<div>
<span>{{ msg }}</span>
</div>
</template> <script>
export default {
name: 'HelloWorld',
// 子组件通过使用 props 接收父组件传递过来的数据
props: {
msg: String
}
}
</script>

Vue2父子传参之父传子:$refs

在父组件中给子组件的标签上添加 ref 等于一个变量,然后通过使用 $refs 可以获取子组件的实例,以及调用子组件的方法和传递参数

父组件:

<template>
<div class="home">
<!-- 在子组件中使用 :变量名=value 的方式向子组件传递数据,子组件通过 props 接收-->
<HelloWorld :msg="fatchData" ref="childEl"/>
<div>
父组件
</div>
<div>
<button @click="changeChildMsg">父组件按钮</button>
</div>
</div>
</template>
<script>
import HelloWorld from '@/components/HelloWorld.vue'
export default {
name: 'Home',
components: {
HelloWorld
},
data () {
return {
fatchData: '我是父组件通过props传递给子组件的文字'
}
},
methods: {
// 点击父组件的按钮修改子组件中显示的文字
changeChildMsg () {
this.fatchData = '通过按钮修改了子组件中显示的问题'
// 父组件调用子组件的方法并传递参数
this.$refs.childEl.showText('我来自父组件')
}
}
}
</script>

然后在子组件中定义相同的方法名,在父组件使用 $refs 调用后触发在子组件中定义的同名方法

子组件:

<template>
<div class="hello">
<b>子组件</b>
<div>
<span>{{ msg }}</span>
</div>
<div>
<button>子组件按钮</button>
</div>
</div>
</template> <script>
export default {
name: 'HelloWorld',
// 子组件通过使用 props 接收父组件传递过来的数据
props: {
msg: String
},
methods: {
// 这个方法由父组件通过 this.$refs.childEl.showText('我来自父组件') 调用触发
showText (text) {
alert(text)
}
}
}
</script>

Vue2父子传参之子传父:$emit

在子组件中我们也可以调用父组件的方法向父组件传递参数,通过$emit来实现

子组件:

<button @click="childClick">子组件按钮</button>

<script>
export default {
name: 'HelloWorld',
methods: {
// 子组件通过 $emit 调用父组件中的方法
childClick () {
this.$emit('setValueName', '我是通过子组件传递过来的')
}
}
}
</script>

然后在父组件中定义并绑定子组件传递的 setValueName 事件,事件名称要和子组件定义的名称一样

父组件:

<HelloWorld  @setValueName="setValueName" />

<script>
import HelloWorld from '@/components/HelloWorld.vue'
export default {
name: 'Home',
components: {
HelloWorld
},
methods: {
// 该方法是由子组件触发的
setValueName (data) {
alert(data) //= > 我是通过子组件传递过来的
}
}
}
</script>

Vue2父子传参:parent/children

  • 父组件通过$children获取子组件的实例数组
  • 子组件通过$parent获取的父组件实例

父组件中可以存在多个子组件,所以this.$children获取到的是子组件的数组

父组件:

<HelloWorld />
<button @click="getSon">children/parent</button> <script>
import HelloWorld from '@/components/HelloWorld.vue' export default {
name: 'Home',
components: {
HelloWorld
},
data () {
return {
parentTitle: '我是父组件'
}
},
methods: {
// 子组件调用这个方法
parentHandle () {
console.log('我是父组件的方法')
},
// 通过 this.$children 获取子组件实例
getSon () {
console.log(this.$children)
console.log(this.$children[0].sonTitle) //= > 我是子组件
this.$children[0].sonHandle() //= > 我是子组件的方法
}
}
}
</script>

子组件:

<button @click="getParent">获取父组件的方法和值</button>
<script>
export default {
name: 'HelloWorld',
data () {
return {
sonTitle: '我是子组件'
}
},
methods: {
// 父组件通过 this.$children 来调用
sonHandle () {
console.log('我是子组件的方法')
},
// 调用父组件的方法和获取父组件的值
getParent () {
console.log(this.$parent)
console.log(this.$parent.parentTitle) //= > 我是父组件
this.$parent.parentHandle() //= > 我是父组件的方法
}
}
}
</script>

Vue2兄弟传参:bus.js

首先新建 bus.js 文件,初始化如下代码:

import Vue from 'vue'
export default new Vue()

然后在需要通信的组件中都引入该 bus 文件,其中一个文件用来发送,一个文件监听接收。派发事件使用 bus.$emit

下面组件派发了一个叫setYoungerBrotherData的事件

<template>
<div>
哥哥组件:<button @click="setYoungerBrotherData">给弟弟传参</button>
</div>
</template>
<script>
import bus from '../assets/bus'
export default {
methods: {
setYoungerBrotherData () {
// 通过 bus.$emit 派发一个事件
bus.$emit('setYoungerBrotherData', '给弟弟传参')
}
}
}
</script>

在另一个页面中使用 bus.$on('setYoungerBrotherData',()=>{}) 监听

<template>
<div>弟弟组件:{{ msg }}</div>
</template>
<script>
import bus from '../assets/bus'
export default {
data () {
return {
msg: ''
}
},
mounted () {
// 通过 bus.$on 监听兄弟组件派发的方法
bus.$on('setYoungerBrotherData', (res) => {
this.msg = res
})
}
}
</script>

Vue2跨级传参:provide/inject

provideinjectvue生命周期上的两个函数,这对选项需要一起使用,以允许一个祖先组件向其所有子孙后代注入一个依赖,不论组件层次有多深,并在其上下游关系成立的时间里始终生效。

提示:provideinject 绑定并不是可响应的。这是刻意为之的。然而,如果你传入了一个可监听的对象,那么其对象的 property 还是可响应的。

祖先组件:

<script>
export default {
name: 'Home',
// 通过 provide 提供的数据可以在该组件层次之下的任何组件使用
provide () {
return {
// 可以传递普通字符串
provideName: '祖先',
// 也可以传递一个异步方法
getOrderInfo: () => {
return this.getOrderList()
}
}
},
methods: {
// 传递一个异步方法获取数据,用来模拟接口请求
getOrderList () {
return new Promise((resolve, reject) => {
// 倒计时两秒模拟请求延迟
setTimeout(() => {
resolve({
code: 'WX15485613548',
name: '农夫安装工单'
})
}, 2000)
})
}
}
}
</script>

孙子组件:

<template>
<div>
{{ bar }}
<button @click="getOrder">异步获取数据</button>
</div>
</template>
<script>
export default {
// 使用 inject 接收祖先生成的数据
inject: ['provideName', 'getOrderInfo'],
data () {
return {
// inject 接收的数据可以作为数据的入口
bar: this.provideName
}
},
mounted () {
console.log(this.provideName) //= >祖先
},
methods: {
getOrder () {
// 调用的是父组件的方法,延迟两秒获取数据
this.getOrderInfo().then(res => {
console.log(res) //= > {code: "WX15485613548", name: "农夫安装工单"}
})
}
}
}
</script>

使用 provide/inject的好处是父组件不需要知道是哪个自组件使用了我的数据,子组件也不需要关心数据从何而来

总结

  • 父子通信:父向子传递数据通过props,子向父传递数据通过$emit事件,父链子链使用$parent/$children,直接访问子组件实例使用$refs
  • 兄弟通信:bus,Vuex
  • 跨级通信:bus,Vuex,provide/inject

Vue2中父子组件通信的几种常用方法的更多相关文章

  1. vue2.0 父子组件通信 兄弟组件通信

    父组件是通过props属性给子组件通信的来看下代码: 父组件: <parent> <child :child-com="content"></chil ...

  2. vue2.0父子组件通信的方法

    vue2.0组件通信方法:props传值和emit监听.(.sync方法已经移除.详情请点击)(dispatch-和-broadcast方法也已经废弃) props方法传值:Props 现在只能单项传 ...

  3. vue2.0父子组件通信以及同级组件通信

    1.父向子通信 父组件为singer.vue.子组件为list-view.vue.需要把歌手的数据传给子组件.则绑定 :data = 'singers' ,singers为父组件的值.data为子组件 ...

  4. 三大前端框架(react、vue、angular2+)父子组件通信总结

    公司业务需要,react.vue.angular都有接触[\无奈脸].虽然说可以拓展知识广度,但是在深度上很让人头疼.最近没事的时候回忆各框架父子组件通信,发现很模糊,于是乎稍微做了一下功课,记录于此 ...

  5. Vue中组件通信的几种方法(Vue3的7种和Vue2的12种组件通信)

    Vue3组件通信方式: props $emit expose / ref $attrs v-model provide / inject Vuex 使用方法: props 用 props 传数据给子组 ...

  6. vue2.0父子组件以及非父子组件通信传参详解

    1.父组件传递数据给子组件 父组件数据如何传递给子组件呢?可以通过props属性来实现 父组件: <parent> <child :child-msg="msg" ...

  7. vue2.0父子组件以及非父子组件如何通信

    1.父组件传递数据给子组件 父组件数据如何传递给子组件呢?可以通过props属性来实现 父组件: <parent> <child :child-msg="msg" ...

  8. React中父子组件间的通信问题

    1.https://blog.csdn.net/sinat_17775997/article/details/59103173 (React中父子组件间的通信问题)

  9. vue2.0父子组件以及非父子组件通信

    官网API: https://cn.vuejs.org/v2/guide/components.html#Prop 一.父子组件通信 1.父组件传递数据给子组件,使用props属性来实现 传递普通字符 ...

随机推荐

  1. Golang编写Windows动态链接库(DLL)及C调用范例

    一.准备. 1.GoLang在1.10版本之后开始支持编译windows动态链接库,可以打开命令行工具使用go version 查看自己的go版本. 2.你的电脑上需要gcc,如果没有的话[点击这里] ...

  2. 使用jsonp实现跨源请求

    jsonp 该技术用来实现跨源请求,即向协议.域名.端口号不同的服务器发送请求 通过使用 script 标签的 src 向服务器发送GET请求http://xxx/xxx?callback=callb ...

  3. 温故知新,.Net Core遇见Postman(API Development),进阶分布式微服务高效调式

    什么是Postman 环境变量(Environments) 全局协议 描述 变量 初始值 当前值 请求协议 request_protocol http http 授权信息 描述 变量 初始值 当前值 ...

  4. 『无为则无心』Python序列 — 18、Python列表概念及常用操作API

    目录 1.列表的概念 (1)列表的定义 (2)列表的应用场景 (3)列表的定义格式 2.列表的常用操作 (1)列表的查找 1)通过下标查找 2)通过方法查找 3)判断是否存在 (2)列表的增加 @1. ...

  5. COURSES 赤裸裸的二分匹配大水题

    COURSES 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include ...

  6. 浅析WebSocket 原理

    浅析WebSocket 原理 长恨此身非我有,何时忘却营营. 简介:先简单了解下WebSocket 原理,日后的使用中再进一步深入研究~ 一.什么是WebSocket WebSocket 是HTML5 ...

  7. C# 8.0和.NET Core 3.0高级编程 分享笔记二:编程基础第一部分

    基础部分被我分为了2篇,因为实在太多了,但是每一个知识点我都不舍得删除,所以越写越多,这一篇博客整理了4个夜晚,内容有点多建议慢慢看.本章涵盖以下主题: 介绍C# 理解C#的基础知识 使用变量 处理空 ...

  8. C语言:FILE p和FILE *p

    FILE p和FILE *p大概可以这么理解:1 . 前一个p指文件型变量,后一个p指文件地址型变量.2 . 前一个p的内存地址已定,后一个p内存地址未定. 前一个是声明类对象,后一个是声明一个可指向 ...

  9. 深度解析CSS中的单位以及区别

    css中有几个不同的单位表示长度,使用时数字加单位.如果长度为0,则可以省略单位. 长度单位可分为两种类型:相对和绝对. 绝对长度 绝对长度单位是一个固定的值,反应真实的物理尺寸,不依赖于显示器.分辨 ...

  10. Tomcat网站根目录设置

    直接将war放入到webapps目录下 修改server.xml文件,在Host节点下添加如下代码 <Context path="/" docBase="web&q ...