1、父子通信 - 通过prop 向子组件传递数据
使用props
传递数据作用域是孤立的,它是父组件通过模板传递而来,想接收到父组件传来的数据,可以通过props选项
来进行接收。
父组件
|
|
子组件
|
|
在子组件中需要通过显示定义好需要从父组件中接收那些数据。
同样的在父组件中在子组件模板中过v-bind
来传递子组件中需要显示接收的数据。
语法: :== v-bind
(是封装的语法糖) :msg = msgData
msg
第一个参数必须要与子组件的props
同名msgData
则是父组件中需要向子组传递的数据
props
可以显示定义一个或一个以上的数据,对于接收的数据,可以是各种数据类型,同样也可以传递一个函数。
在 data 选项中,当前实例(当前组件中改动)可以任意改变data选项里的数据
,Vue
传递数据时是基于数据单向流动
,子组件不能改变当前实例中的 props 任何属性,需要通知父组件改变相应的值,重新改变。
2、父子通信 - 通过$emit
和$on
向父组件传递数据
父组件使用 $on(eventName)
监听事件
|
|
子组件使用 $emit(eventName)
触发事件
|
|
3、非父子通信 - 通过eventBus
传递数据
公共事件总线eventBus
的实质就是创建一个vue
实例,通过一个空的vue
实例作为桥梁实现vue
组件间的通信。它是实现非父子组件通信的一种解决方案。
然后在组件中,可以使用$emit, $on, $off 分别来分发、监听、取消监听事件:
第一步:项目中创建一个js
文件(我通常给它取个名字为bus.js
),引入vue
,创建一个vue
实例,导出这个实例,代码如下(一共就两行):
|
|
第二步:在需要通信的组件中分别引入这个bus.js
|
|
第三步:传递数据的组件里通过vue
实例方法$emit
发送事件名称和需要传递的数据。(发送数据组件)
|
|
第四步:被传递数据的组件内通过vue
实例方法$on
监听到事件和接受到数据。(接收数据的组件)这里通常挂载监听在vue
生命周期created
和mounted
当中的一个,具体使用场景需要具体的分析
|
|
通过以上的四步其实就已经实现了最简单的eventbus
的实际应用了。
但是到这儿后,一定要注意一个最容易忽视,又必然不能忘记的东西,那就是清除事件总线eventBus
第五步:在vue
生命周期beforeDestroy
或者destroyed
中用vue
实例的$off方法清除eventBus
|
|
总结一下,这里只是介绍如何使用eventBus
来解决非父子组件通信,但是当项目较大较复杂时,并不适合。到那时,vuex
才是vue
给我们提供的最理想的方式。