Vue组件数据通讯新姿势:$attrs 和 $listeners
特别声明:小站对部分原创文章已开启付费阅读,并开通年费VIP通道,年费价格为 ¥365.00元。如果您喜欢小站的内容,可以点击开通会员进行全站阅读。如果您对付费阅读有任何建议或想法,欢迎发送邮件至: airenliao@gmail.com!(^_^)
学习Vue也有一段时间了,在项目中使用Vue也有好几个了,但Vue组件间的状态管理(数据通信)一直是自己的死穴。对于Vue组件间的数据通信,无外呼是父组件向子组件、子组件向父组件、兄弟组件以及嵌套组件之间的数据通信。而且组件之间的通信方式也有很多种。@Gongph的《Vue 父子组件通信的十种方式》一文就详细的介绍了Vue组件,指的是父子组件之间的数据通信就有差不多十种方式。但很多时候我们组件之间的数据通信不仅仅是停留在父子组件之间的数据通信。比如说还有兄弟组件和嵌套组件之间的数据通信。
如果我们抛开嵌套组件之间的数据通信,我们可以用简单的下图来描述Vue组件之间的数据通信:
事实上除了上图方式对数据进行通信之外,还有一些其他的方式,比如父组件获取子组件数据和事件可以通过:
- 通过给子组件绑定
ref
属性来获取子组件实例 - 通过
this.$children
获取子组件实例
对于子组件获取父组件数据和事件,可以通过:
- 通过
props
传递父组件数据和事件,或者通过$emit
和$on
实现事件传递 - 通过
ref
属性,调用子组件方法,传递数据;通过props
传递父组件数据和事件,或者通过$emit
和$on
实现事件传递 - 通过
this.$parent.$data
或者this.$parevent._data
获取父组件数据,通过this.$parent
执行父组件方法
对于兄弟组件之间数据通信和事件传递,可以通过:
- 利用
eventBus
挂载全局事件 - 利用
$parent
进行数据传递,$parent.$children
调用兄弟组件事件
另外,复杂一点的,可以通过Vuex完成Vue组件数据通信。特别是多级嵌套组件间的数据通信。但如果仅仅是数据之间传递,而不做中间处理,使用Vuex有点浪费。不过,自Vue 2.4版本开始提供了另一种方法:
使用
v-bind="$attrs"
将父组件中不被认为props
特性绑定的属性传递给子组件。
通常该方法会配合interiAttrs
一起使用。之所以这样使用是因为两者的出现使得组件之间跨组件的通信在不依赖Vuex和eventBus
的情况下变得简洁,业务清晰。
其实这也就是我们今天要了解的另一个知识点。多级嵌套组件之间,我们如何借助$attrs
和$listeners
来实现数据之间的通信。
业务场景
刚才提到过,我们接下来要聊的是多级嵌套组件之间的数据通信。为了让事情不变得太过于复杂(因为太复杂,对于初学者而言不易于理解和学习)。这里我们就拿三级组件之间的嵌套来举例。比如我们有三个组件ComponentA
、ComponentB
和ComponentC
,而且它们之间的关系是ComponentA > ComponentB > ComponentC
(>
是包含关系),用下图来描述或许更易于明白他们之间的关系:
就三级嵌套的组件而言,他们的关系相对而言要简单一些:
ComponentA
组件是ComponentB
组件的父组件,他们的关系是父子关系ComponentB
组件是ComponentC
组件的父组件,他们的关系也是父子关系ComponentA
组件是ComponentC
组件的祖先组件,他们的关系是祖孙关系
对于这三个组件之间的数据通信,按照我们前面所掌握的知识,估计想到的是:
props
向下,$emit
向上。
也就是说,ComponentA
向ComponentB
可以通过props
的方式向子组件传递,ComponentB
向ComponentA
通过在ComponentB
组件中$emit
向上发送事件,然后在ComponentA
组件中$on
的方式监听发送过来的事件。对于ComponentB
和ComponentC
两组件之间的通信也可以使用类似的方式。但对于ComponentA
组件到ComponentC
组件之间的通信,需要借助ComponentB
组件做为中转站,当
如需转载,烦请注明出处:https://www.w3cplus.com/vue/vue-js-attrs-and-listeners.html
如果文章中有不对之处,烦请各位大神拍正。如果你觉得这篇文章对你有所帮助,打个赏,让我有更大的动力去创作。(^_^)。看完了?还不过瘾?点击向作者提问!