vue组件之间通信方式

      • 一、全局事件总线
      • 二、props和$emit
      • 三、Vuex(状态管理)
      • 四、$refs
      • 五、provide / inject

一、全局事件总线

范围:任意组件间
步骤:1、创建事件总线
第一种方式:通过自定义事件总线方式

import Vue from 'vue';export const globalBus = new Vue();

局部引用

import { globalBus } from '@/utils/globalBus'globalBus.$emit('message-count', num) //发送消息globalBus.$on('message-count', (num) => {}) //接收消息

第二种方式:通过原型绑定

main.js

new Vue({el: '#app',render: h => h(App),beforeCreate(){Vue.prototype.$bus = this}})

局部引用

 this.$bus.$emit('message-count',num); //发送消息 this.$bus.$on('hello',(num)=>{}); //接收消息

解绑事件

beforeDestroy(){this.$bus.$off('message-count')}

二、props和$emit

范围:父子组件间

父组件

<template><child-component :message="parentMessage" @update="handleUpdate"></child-component></template><script>export default {data() {return {parentMessage: 'Hello from parent',};},methods: {handleUpdate(message) {console.log('Received from child:', message);},},};</script>

子组件

<template><div><p>{{ message }}</p><button @click="sendMessage">Send Message</button></div></template><script>export default {props: ['message'],methods: {sendMessage() {this.$emit('update', 'Hello from child');},},};</script>

三、Vuex(状态管理)

范围:多个组件之间共享状态,可以访问和修改共享的状态
1、在根组件中创建和配置Vuex

import Vue from 'vue'import Vuex from 'vuex'Vue.use(Vuex);export default new Vuex.Store({state:{message: 'message from Vuex'},mutations:{updateMessage(state,msg){state.message = msg ;}}})

2、在子组件中使用Vuex和触发mutations

export default {computed:{message(){return this.$store.state.message}},methods:{sendMessage(){this.$store.commit('updateMessage','mes from component')}}}

四、$refs

范围:父组件访问子组件

父组件

<template> <div> <child-component ref='child'></child-component> <button @click='sendMessage'></button></div></template><script>export default {methods:{sendMessage(){this.$refs.child.receiveMessage('mes from parent');}}}</script>

子组件

<template><div><p>{{ message }}</p></div></template><script>data(){return {message:''}},methods:{receiveMessage(message){this.message = message;}}</script>

五、provide / inject

范围:父组件向子孙组件提供数据,可跨层级通信

父组件提供数据

<template><div><child-component></child-component></div></template><script>export default {provide: {message:'message from parent'}}</script>

子组件注入并使用数据

<template><div>{{ message }}</div></template><script>export default {inject:['message']}</script>