Vue——组件通信
·
1.作用
组件通信的目的是可以让不同组件之间进行数据共享、触发事件、交互调用。
2.组件通信的方式
2.1 父组件和子组件间的传递
子组件通过props接收父组件传递来的数据,通过$emit事件将数据传递给父组件。
// 父组件
<child-component :value="parentValue" @update="handleUpdate"></child-component>
// 子组件
<template>
<div>
// update作为父组件的一个事件属性;$event.target.value为参数,父组件通过handleUpdate接收
<input :value="value" @input="$emit('update', $event.target.value)">
</div>
</template>
<script>
export default {
props: ['value']
}
</script>
2.2 事件总线
通过创建一个事件总线实例,不同组件之间可以通过这个事件总线实例进行通信。一般用于Vue2中的兄弟组件间的通信。
// 在eventBus.js创建事件总线实例
import Vue from 'vue';
export const EventBus = new Vue();
// 组件A和B,通过引用该实例实现通信
// 组件A,发送数据方
EventBus.$emit('event-name', data);
// 组件B,接收数据方
EventBus.$on('event-name', (data) => {
// handle the data
});
2.3 状态管理库(Vuex、Pinia)
它们采用集中式去管理组件的状态,并以相应的规则去保证该状态以一种可预测的方式进行改变。
// Vue2的Vuex
// store.js
import Vue from 'vue';
import Vuex from 'vuex';
Vue.use(Vuex);
export default new Vuex.Store({
state: {
value: ''
},
mutations: {
setValue(state, payload) {
state.value = payload;
}
},
actions: {
updateValue({commit}, payload) {
commit('setValue', payload);
}
}
});
2.4 provide/inject
provide提供数据,inject接收数据,实现顶层到底层的组件通信,一般用于上下代组件间的数据传递。
// 父组件
export default {
provide() {
return {
value: this.value
}
},
data() {
return {
value: 'some value'
}
}
}
// 子组件
export default {
inject: ['value'],
created() {
console.log(this.value);
}
}
2.5 $refs
同样是实现父子组件的通信,通过使用$refs可以让父组件能直接访问子组件的方法或数据。
// 父组件,为子组件绑定ref
<child-component ref="childRef"></child-component>
export default {
methods: {
callChildMethod() {
this.$refs.childRef.someMethod();
}
}
}
// 子组件
export default {
methods: {
someMethod() {
console.log('child method');
}
}
}
更多推荐
所有评论(0)