说到Vue3组件通信,就不得不从Vue2组件通信说起。朋友们查漏补缺。先一步步看一下组件的几种用法:Vue2用法总结帮助小伙伴们加深记忆。如果对基础不是很熟悉,可以去官网看看。父子组件通信propsparenttochild$emitchildtoparentref,$refschildtoparent$parentchildtoparent$childrenparenttochild(Vue3此方法无效)多级父子组件通信provide,injectparenttochildorchildtoparent//providestatementprovide(){return{title:'I'manapp',ComApp:this,}}//注入use//使用时,可以获取到父组件的this,即ComApp,传递数据注入:['title','ComApp'],$attrs使用attributes的传递数据配合inheritAttrs使用$listeners(Vue3此方法使监听功能失效是attrs的一部分)non-关系组件通信(EventBus也叫事件总线)Vue2的EventBus://eventBus.jsconsteventBus=newVue()exportdefaulteventBus//ChildComponent.vueimporteventBusfrom'./eventBus'exportdefault{mounted(){//添加eventBus监听器eventBus.$on('custom-event',()=>{console.log('自定义事件触发red!')})},beforeDestroy(){//移除事件总线监听器eventBus.$off('custom-event')}}//ParentComponent.vueimporteventBusfrom'./eventBus'exportdefault{methods:{callGlobalCustomEvent(){eventBus.$emit('custom-event')//ChildComponent挂载时,控制台会显示一条消息}}}$在Vue3on,$off,$once方法中被完全移除。$emit仍然包含在现有API中,因为它用于触发由父组件以声明方式添加的事件处理程序。Vue3的EventBus://main.jsimportmittfrom'mitt'letapp=createApp(App)app.config.globalProperties.$myhub=newmitt()//ParentComponent.vueexportdefault{//.....methods:{getattrs(){this.$myhub.emit('myhub','我是小白龙')}}//ChildComponent.vueexportdefault{//.....mounted(){this.$myhub.on('myhub',(data)=>{console.log(data)//我是小白龙})},}总结:大多数情况下,不鼓励组件间使用全局事件总线进行通信。虽然在短期内通常是最简单的解决方案,但从长远来看,维护起来总是令人头疼。根据情况,事件总线有多种替代方案:Props和事件应该是父子组件之间通信的首选。兄弟节点可以通过它们的父节点进行通信。Provide和inject允许组件与其插槽的内容进行通信。这对于总是一起使用的紧密耦合的组件很有用。provide/inject也可以用于组件之间的远距离通信。它可以帮助避免“proppass-through”,即props需要通过多层组件向下传递,但这些组件本身可能不需要这些props。也可以通过重构使用插槽来避免Prop传递。如果中间组件不需要某些道具,则可能存在关注点分离问题。在这类组件中使用slot,可以让父节点直接为其创建内容,这样就可以直接传递props,不需要中间组件的参与。全局状态管理,例如Vuex。Vuex//store.state.count值
