- 父子组件通信:
props/$emit
;ref/$refs
;$attrs / $listeners
;$parent / $children
- 兄弟组件通信: eventBus;vuex
- 跨级通信: eventBus;Vuex;
$attrs / $listeners
一、props/$emit(父子组件通信)
1.父组件向子组件传值
通过 props
传值。
父组件的代码:
子组件的代码(即 child.vue):
{{item}}
2.子组件向父组件传值
$emit
绑定一个自定义事件, 当这个语句被执行时, 就会将参数arg
传递给父组件,父组件通过v-on
监听并接收参数。
父组件的代码:
{{item}} => {{currentIndex}}
子组件的代码(即 child.vue):
二、ref/$refs(父子组件通信)
ref
如果在普通的 DOM 元素上使用,引用指向的就是 DOM 元素;如果用在子组件上,引用就指向组件实例,可以通过实例直接调用组件的方法或访问数据。也算是子组件向父组件传值的一种。
- vue访问子组件实例或子元素
父组件 parent.vue:
子组件 child.vue:
child 的内容
三、eventBus(兄弟组件通信、跨级通信)
eventBus 又称为事件总线,在 vue 中可以使用它来作为沟通桥梁的概念, 就像是所有组件共用相同的事件中心,可以向该中心注册发送事件或接收事件, 所以组件都可以通知其他组件。一般用来兄弟组件和隔代组件传值。
1.首先需要创建一个事件总线并将其导出, 以便其他模块可以使用或者监听它。
bus.js:
import Vue from 'vue'
export const bus = new Vue()
2.发送事件,假设有 child1、child2 两个兄弟组件,在 child1.vue 中使用bus.$emit()发送事件。
parent.vue:
child1.vue:
3.在 child2.vue 中使用bus.$on()接收事件。
计算和:
child1Num => {{child1Num}}
count + child1Num => {{count}}
4.如果想移除事件的监听, 可以像下面这样操作:
import { bus } from './bus.js'
bus.$off('addition', {})
四、Vuex(兄弟组件通信、跨级通信)
父组件:
子组件childA:
我是A组件
因为你点了B,所以我的信息发生了变化:{{BMessage}}
子组件 childB:
我是B组件
因为你点了A,所以我的信息发生了变化:{{AMessage}}
vuex的store.js
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const state = {
// 初始化A和B组件的数据,等待获取
AMsg: '',
BMsg: ''
}
const mutations = {
receiveAMsg(state, payload) {
// 将A组件的数据存放于state
state.AMsg = payload.AMsg
},
receiveBMsg(state, payload) {
// 将B组件的数据存放于state
state.BMsg = payload.BMsg
}
}
export default new Vuex.Store({
state,
mutations
})
然后需要在 main.js
中引入 vuex
import Vue from 'vue'
import App from './App'
import router from './router'
import store from './store';
Vue.config.productionTip = false
new Vue({
el: '#app',
router,
store,
components: { App },
template: ' '
})
五、$attrs/$listeners
(父子组件通信、跨级通信)
parent.vue:
childA.vue:
props 接收到的 name: {{ name}}
childA 的 $attrs: {{$attrs}}
childB.vue:
props 接收到的 age: {{age}}
childB 的 $attrs: {{$attrs}}
六、$children/$parent
(父子组件通信)
parent.vue:
{{msg}}
child.vue:
{{messageA}}
获取父组件的值为: {{parentVal}}
要注意边界情况,如在 #app 上拿
$parent
的是new Vue()
的实例,在这实例上再拿$parent
得到的是undefined
,而在最底层的子组件拿$children
是个空数组。也要注意得到$parent 和 $children
的值不一样,$children
的值是数组,而$parent
是个对象。