组件之间的通信方式有哪些
父组件向子组件传递数据
props
属性传值,子组件中定义接收的props
,父组件将对应的props
属性写在子组件标签上即可完成传递provide
和inject
,通过provide
可以向后代组件进行传递数据,后代组件需要使用inject
接收上级组件传递过来的数据
子组件向父组件传递从数据
$emit
,子组件通过emit
事件传递参数,父组件接收子组件传递过来的事件和参数
互相通讯
- 事件总线(
Vue2
),Vue
本身也可以是一个事件总线,可以发布订阅事件 Vuex
、pinia
通过数据共享的方式,双方组件都可以实时获取到共享数据
parent、children
$parent
,通过this.$parent
访问父级组件的实例$children
,通过children
让组件访问子组件实例中的属性和方法,注意访问到的数据并不是响应式数据
ref
通过ref
的方式直接获取访问子组件中的属性和方法
WARNING
注意,在Vue3
中,子组件需要定义defineExpose
宏才能被父组件访问到
inheritAttrs
例如现在有一个场景是这样子的
下面component
,就简写成CMP
吧
CMP1->CMP2->CMP3
,如果这个时候CMP1
要传递数据给CMP3
,可能需要通过一层层props
来传递(没有provide
和inject
的情况下),Vue
有个inheritAttrs
-Api
,允许将没有被props
解析的属性被“透传”到子组件中。而这些子组件可以通过$attrs
进行获取
html
<component1>
<component2>
<component3>
</component3>
</component2>
</component1>
TIP
如果是事件传递,可以通过$listeners
将接收到的事件传递到子组件中