Vue非父子组件通信

93 阅读1分钟
  • 在组件绑定事件,但是事件处理函数放在了父组件里,用原生js里的事件的话,是实现不了的,这时候就用到了vue的自定义事件,命令——自定义的事件调用,第二个参数可以传个值
  • 自定义事件需要使用this.$emit执行自定义的事件,该函数是在子组件内进行调用,自定义事件基本都是为了做传值操作的。$emit用来触发自定义事件。

非父子组件通信

通过空对象的$emit/$on方法传值

  1. $on就是来监听$emit的,而$emit用来触发自定义事件,只要$emit里的自定义事件一触发,$on就会订阅到vue对象身上的自定义事件,只要自定义事件一执行,那么$on的第二个参数回调函数就会执行。
  2. new Vue()空的Vue对象就相当于是基站,中转站。使用vue对象的$.emit方法发布信息,使用vue对象的$on订阅信息。
  3. 这种方法通过一个空的Vue实例作为中央事件总线(事件中心),用它来触发事件和监听事件,巧妙而轻量地实现了任何组件间的通信。包括父子、兄弟、跨级。当我们的项目比较大时,可以选择更好的状态管理解决方案vuex。

个人对Vue非父子组件通信步骤做了总结,具体如下:

1、在src目录下,创建一个空的Vue对象。代码如下图

1.png

2、被传递数据的组件中引入空Vue对象(上图的Bus对象),然后使用Bus.$emit方法,该方法第一个参数是自定义的事件名(该事件不用真正存在,但是要起这个名字),第二个参数就是要共享的数据。如下图:

3.png 当点击按钮时,改变fontSize数据值,并调用Bus.$emit方法,把改变后的数据传出去。

3、哪个组件想共享数据,就在哪个组件引入空的Vue对象(Bus),然后在mounted生命周期中调用Bus.$on方法,该方法第一个参数是自定义事件名,第二个参数是回调函数,该回调函数接收一个参数,就是共享的数据,然后可以把共享的数据存储到状态里使用,传过来的数据变了,得到数据的组件界面也会重新渲染。

2.png 大多数时候都在mounted生命周期里订阅$on