非父子组件间通信

上一篇:父子组件间单向数据流的解决办法

非父子组件之间的通信,可以通过一个空的 Vue 实例作为中央事件总线(事件中心),用他来触发事件和监听事件。

在这里,如果是工作中的新手看了官网的例子直接上手写,会有些发懵。这个作为事件总线空的 Vue 实例我该写哪里去?因为工作中我们的组件都是互相独立的,不可能写一起的,作用域是不同的,所以需要稍作调整

一、在 main.js 中初始化根 Vue 之前,添加一个 data 对象,内写入一个名为 Event 的空 Vue 对象,也就是中央事件总线
new Vue({
  el: '#app',
  data:{
    Event: new Vue()
  },
  render: h => h(App)
})
二、在各组件中使用 Vue 的实例属性 $root 来访问我们当前组件树的根 Vue 实例,这样就可以使用

vm.$root.Event 来访问我们定义的事件发射器 Event
比如我在 Hello.vue 组件中想发送数据到 Vue.vue 组件中

<template>
    <div class="hello">
        <h3>我是 {{name}} 组件</h3>
        <button @click="send">发送数据到Vue组件中</button>
    </div>
</template>

<script>
export default {
    data(){
        return {
            name: 'Hello'
        }
    },
    methods:{
        send(){
            // 触发组件 Hello 中的事件
                           // $emit(事件名,数据)
            this.$root.Event.$emit('hello',this.name)
        }
    }
}
</script>

Vue.vue 组件中进行接收

<template>
    <div class="Vue">
        <h3>我是 {{name}} 组件</h3>
    </div>
</template>

<script>
export default {
    data(){
        return {
            name: ''
        }
    },
    mounted(){
        // 在组件 Vue 创建的钩子中监听事件
                        // $on(事件名,数据)
        this.$root.Event.$on('hello',name => {
            this.name = name
        })
    }
}
</script>

这样就可以实现数据的通信了


非父子组件通信

如果在组件间通信复杂的情况下,我们应该考虑使用专门的 状态管理模式 vuex

下一篇:slot 内容分发(组件相互嵌套)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 这篇笔记主要包含 Vue 2 不同于 Vue 1 或者特有的内容,还有我对于 Vue 1.0 印象不深的内容。关于...
    云之外阅读 10,457评论 0 29
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,347评论 19 139
  • 1、父子组件通信 查看官方文档中关于父子组件的相互通信,其推荐的是父组件中使用 v-on监听子组件上 $emit ...
    叶小七的真命天子阅读 5,331评论 0 3
  • 得到APP 刘润专栏文章总结笔记 -->TOP1概念: 看的见的手(政府):凯恩斯认为,经济也得需要国家调控这只“...
    瑾兰阅读 5,180评论 0 2
  • 前段时间在朋友圈发了阿德莱德粉色湖泊的照片,引得很多宝宝想前去观看。而网上关于粉湖的资料比较少,所以打算写一篇攻略...
    米娅的旅程阅读 2,934评论 0 0