当前位置: 首页 > Web前端 > vue.js

详细讲解在vue中如何使用$attrs和$listeners进行祖孙之间的通信(篇幅有点长,建议收藏)

时间:2023-03-31 23:42:00 vue.js

#app{width:950px;height:600px;box-sizing:border-box;border:3pxdashed#e9e9e9;background-color:#cde;margin:50px;}问题描述祖孙之间常用的三种通信方式:vuex关于vuex,笔者之前写过一篇文章。附上链接:https://segmentfault.com/a/11...Vue实例总线事件Vue实例总线不仅可以用于祖孙组件之间的通信,还可以用于兄弟组件之间的通信。使用范围还是蛮广的,笔者之前写过一篇关于vue实例总线的使用的文章,以兄弟组件之间的通信为例。附上链接:https://segmentfault.com/a/11...$attrs和$listeners也可以这样写,请继续阅读官方对$attrs和$listeners的定义,我们先看看如何官方定义,这里截图:官方地址也附上https://cn.vuejs.org/v2/api/?...开个玩笑,官方定义有点晦涩。下面我们将结合实际例子来讲解$attrs和$listeners的用法。所以我们需要先搭建一个项目,结构是祖孙组件数据传输项目结构项目结构图我们知道,项目最外层的vue组件就是App。Vue是父组件,sun.vue是孙组件。即爷爷、父亲、儿子的祖孙关系成分。在这样的结构中,我们实现了从祖父组件到孙子组件的数据传递。$attrs的用法$attrs我的理解是:一般情况下:父组件通过v-bind绑定一个数据给子组件,子组件通过props接收,可以在子组件的html中使用。但是,如果父组件将其v-binding到子组件,而子组件没有使用props接收它怎么办?注意:此时父组件传递过来的数据会被挂载(赋值)到子组件自带的对象$attrs中,所以:$attrs是一个容器对象,这个容器对象会存储:parentcomponent代码层理解子组件接收到的数据,无需props声明。我们使用上面搭建的项目,父组件使用App.vue,子组件使用fu.vue。(其实项目中的两个组件就是父组件和父组件,但是父组件其实是父子组件的一种关系,也可以这样使用)父组件的代码在父组件中.我们向父组件传递4个数据。msg1、msg2、msg3、msg4,它们的数据类型分别是string、string、array、object":msg3="msg3":msg4="msg4">

#app{width:950px;height:600px;box-sizing:border-box;border:3pxdashed#e9e9e9;background-color:#cde;margin:50px;}父组件代码在父组件中组件中,我们只接收到props中的msg1,没有接收到props中的其他三个。所以props中没有接收到的其他三个会自动存储到$attrs容器对象中。同时,通过$attrs对象,我们也可以获取对应父组件传来的,props中没有接收到的数据值,在html中也可以使用。.fatherClass{width:850px;高度:400px;背景色:#baf;左边距:50px;margin-top:50px;}看一下上面爷爷组件代码的最终渲染图:确实是一个fu.vue组件未在props中声明的组件传递过来的数据要接收在$attrs对象中。为了更直观的看到效果,我们可以在mountedhook中打印这个组件的实例。在这个实例中,我们还可以看到存储在$attrs中的数据。打印效果图如下:至此,验证了上面这句话:$attrs是一个容器对象,这个容器对象会存储:父组件传递过来,子组件接收到的数据,没有使用props声明,那么这和我们祖父母组件之间传递数据有关系吗?很重要,很重要!父组件传递给孙子组件的逻辑过程其实,父组件传递给孙子组件的逻辑过程是先通过父组件传递父组件给父组件。当然,父组件并没有在props中接收到它,所以父组件传给父组件的数据会被存储在父组件的$attrs对象中,然后,通过v-bind="$attrs”,将这个$attr传递给孙子组件,在孙子组件中使用props接收$attrs中的数据,是的,这样就实现了。祖孙之间的数据传递需要通过中间的父组件$attrs来桥接。其实就是这个意思。再添加一个孙子组件.sunClass{宽度:750px;高度:180px;背景色:#bfa;边距顶部:80px;margin-left:50px;}祖孙最终渲染,祖孙成真...$attrs一般和interitAttrs一起使用,通常是inheritAttrs:false,//默认情况下,在html标签上传递的数据将被继承。您可以通过检查DOM元素看到这一点。$listeners的使用使用$listeners将孙组件的数据传递给父组件。从逻辑上讲,它也用在中间的桥父组件上。我的理解是$listeners可以将子组件的emit方法通知给父组件。成分。代码如下:第一步,在中间的父组件中添加$listenners第二步,定义事件方法父组件例如这里定义一个fromSun事件方法,可以被孙子组件的emit触发。第三步,孙子组件可以触发父组件的事件方法。例如这里我们点击孙子组件中的按钮,然后数据传给master组件去孙传祖的效果图总结。好记性不如烂笔头。让我们记录一下。欢迎大家批评指正,顺便多多关注,点赞,鼓励。嘿嘿