Vue2.4中$attrs和$listeners的使用-学习笔记

Vue2.4中$attrs和$listeners的使用-学习笔记首先我们来看下面的一张图,图中表示一个多级组件嵌套的情形。现在我们来讨论一种情况,A组件与C组件怎么通信,我们有多少种解决方案?我们使用VueX来进行数据管理,但是如果项目中多个组件共享状态比较少,项目比较小,并且全局状态比较少,那使用VueX来实现该功能,并没有发挥出VueX的威力。 使用B来做中转站,当A组件需要把信息传给C组件时,B接受A组件的信息,然后利用属性传给C组件,这是…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

首先我们来看下面的一张图,图中表示一个多级组件嵌套的情形。

Vue2.4中$attrs和$listeners的使用-学习笔记

现在我们来讨论一种情况,A组件与C组件怎么通信,我们有多少种解决方案?

  1. 我们使用VueX来进行数据管理,但是如果项目中多个组件共享状态比较少,项目比较小,并且全局状态比较少,那使用VueX来实现该功能,并没有发挥出VueX的威力。
  2. 使用B来做中转站,当A组件需要把信息传给C组件时,B接受A组件的信息,然后利用属性传给C组件,这是一种解决方案,但是如果嵌套的组件过多,会导致代码繁琐,代码维护比较困难;如果C中状态的改变需要传递给A, 使用事件系统一级级往上传递 。本来
  3. 自定义一个Vue 中央数据总线,这个情况适合碰到组件跨级传递消息,但是使用VueX感觉又有点浪费的项目中,但是缺点是,碰到多人合作时,代码的维护性较低,代码可读性低

在很多开发情况下,我们只是想把A组件的信息传递给C组件,如果使用props 绑定来进行信息的传递,虽然能够实现,但是代码并不美观。

在vue2.4中,为了解决该需求,引入了$attrs 和$listeners , 新增了inheritAttrs 选项。 在版本2.4以前,默认情况下父作用域的不被认作props的属性属性百年孤独,将会“回退”且作为普通的HTML特性应用在子组件的根元素上。如下列的例子

 

父组件demo代码如下

<template>
   <div>
     <child-dom
      :foo="foo"
      :coo="foo"
     >
     </child-dom>
   </div>
</template>
<script>
   import childDom from "./ChildDom.vue";
   export default {
     data() {
        return {
          foo:"Hello, world",
          coo:"Hello,rui"
        }
     },
     components:{childDom},
   }
</script>

子组件child-dom代码如下

<template>
   <div>
      <p>foo:{
 
 {foo}}</p>
   </div>
</template>
<script>
export default {
 name:'child-dom'
 props:["foo"]
}
</script>

当显示父组件时,查看Dom结构,结构如下
Vue2.4中$attrs和$listeners的使用-学习笔记

在2.4中新增选项inheritAttrs  inheritAttrs的默认值为true, 将inheritAttrs的值设为false, 这些默认的行为会禁止掉。但是通过实例属性$attrs ,可以将这些特性生效,且可以通过v-bind 绑定到子组件的非根元素上。

修改子组件代码如下

<template>
   <div>
      <p>foo:{
 
 {foo}}</p>
      <p>attrs:{
 
 {$attrs}}</p>
      <childDomChild v-bind="$attrs"></childDomChild>
   </div>
</template>
<script>
import childDomChild from './childDomChild';
export default {
 name:'child-dom'
 props:["foo"],
 inheritAttrs:false,
}
</script>

新增子组件 childDomChild

<template>
  <div>
   <p>coo:{
 
 {coo}}</p>
  </div>
</template>
<script>
  export default {
    name:'childDomChild'
    props:["coo"],
    inheritAttrs:false
  }
</script>

输出的结果如下

Vue2.4中$attrs和$listeners的使用-学习笔记

从上面的代码,可以看出使用$attrs ,inheritAttrs 属性 能够使用简洁的代码,将A组件的数据传递给C组件 ,该场景的使用范围还是挺广的。

此时我们又想到了一个问题,c组件的信息,怎么同步给a组件呢? 

vue2.4版本新增了$listeners 属性,我们在b组件上 绑定 v-on=”$listeners”, 在a组件中,监听c组件触发的事件。就能把c组件发出的数据,传递给a组件。

A组件代码更新如下

<template>
 <div>
   <child-dom
    :foo="foo"
    :coo="coo"
     v-on:upRocket="reciveRocket"
   >
   </child-dom>
 </div>
</template>
<script>
 import childDom from "@/components/ChildDom.vue";
 export default {
   name:'demoNo',
   data() {
     return {
       foo:"Hello, world",
        coo:"Hello,rui"
    }
  },
 components:{childDom},
 methods:{
   reciveRocket(){
      console.log("reciveRocket success")
   }
 }
}
</script>

b组件更新如下

<template>
 <div>
 <p>foo:{
 
 {foo}}</p>
 <p>attrs:{
 
 {$attrs}}</p>
 <childDomChild v-bind="$attrs" v-on="$listeners"></childDomChild>
 </div>
</template>
<script>
import childDomChild from './childDomChild';
export default {
 name:'child-dom'
 props:["foo"],
 inheritAttrs:false,
}
</script>

c组件更新如下

<template> 
 <div>
 <p>coo:{
 
 {coo}}</p>
 <button @click="startUpRocket">我要发射火箭</button>
 </div>
</template>
<script>
 export default {
 name:'childDomChild',
 props:['coo'],
 methods:{
 startUpRocket(){
 this.$emit("upRocket");
 console.log("startUpRocket")
 }
 }
 }
</script>

运行效果如下

Vue2.4中$attrs和$listeners的使用-学习笔记

 

现在我们应该清楚了$attrs,$listernersinheritAttrs 的作用了吧

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/180639.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 至强e5处理器天梯图_e系列cpu天梯图

    至强e5处理器天梯图_e系列cpu天梯图lintel的至强CPU(Xeon)是为服务器准备的,优点核心数、线程数超多,对多任务处理优势明显,现在很多桌面电脑也会搭配志强CPU,用于游戏挂机,多任务处理等等。那么你们知道至强CPU性能排行榜,志强CPU中哪个最强,感兴趣的朋友一起来看看至强系列cpu天梯图,由本站2020年6月发布。至强CPU单线程跑分和多线程跑分性能排行榜:至强系列cpu天梯图2020:(数据比较多,大家可以使用CTR…

  • centos linux mysql 10060远程错误代码

    centos linux mysql 10060远程错误代码

    2021年10月19日
  • C++实现贪吃蛇(控制台)

    C++实现贪吃蛇(控制台)游戏介绍有一条蛇,在屏幕上爬,用上下左右键控制吃东西,吃得多了,到了一定积分,就能过关。越吃越长,不能碰墙,不能咬自己的尾巴,没了,哈哈。这个蛇是条很有个性的蛇它会吃多少吐多少(如果要取消这个特性可以在代码中修改一行代码即可,我已经标注出来了)话不多说直接上代码(代码中有详细注释)!可以直接运行的://本来我是想用C语言实现的无奈水平有限,只能在C++下执行了,注意:这里使用的字符集为Unicode#define_CRT_SECURE_NO_WARNINGS#include<s

  • python中的type和object详解

    python中的type和object详解关于这篇博客这篇博客主要描述Python的新风格对象(newstyleobjects),如下:1.和分别是什么?2.用户自定义的类和实例之间是怎么联系的?它们和内置类型又是怎么联系的?

  • 手机里实现图片文字识别的实用方法[通俗易懂]

    手机里实现图片文字识别的实用方法[通俗易懂]突然接到老板给的一个任务——把一篇文章排版出来,你会怎样做?是一个字一个字手动手动输入呢?还是语音识别呢?当然,这两种方法都可行,但是不够简单方便。手动输入太慢,语音识别又有点麻烦,如果普通话不好,识别很可能会出错。那什么方法,实现图片文字识别最简单,最方便,还很精确呢?今天就来和大家分享一下,手机里的逆天黑科技,实现图片文字识别,只需5秒钟!方法一:打开QQ,左上角【扫一扫】——手机…

  • python画图小代码

    python画图小代码奥运五环importturtlet=turtle.Pen()t.speed(1)#画笔颜色为蓝色t.pencolor(“blue”)#画笔宽度为8t.pensize(8)#画半径为60的圆,篮圈t.circle(60)#第一个环t.penup()t.goto(100,0)t.pendown()设置环的颜色t.pencolor(“black”)t.circle(60)#第二个环t.penup()t.goto(200,0)t.pendown()t.pen

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号