vue $attrs和$listenners

Vue2.x 中的a t t r s 和 attrs和attrs和listeners
或许很多Vue小白跟我一样, 在之前不太了解a t t r s 和 attrs和attrs和listenners这两个API是干嘛的, 甚至没有听过或者使用过。下面我来浅述一下我对这两个API的理解。

下文将基于下面这张图片来进行解释,现在我们有三个组件, 组件之间的结构关系如下图所示: A:爷爷组件、B:父亲组件、C:儿子组件

$attrs

为什么要用$attrs?

场景: 现在组件的结构如上图所示,我们要实现由A组件到C组件之间的数据通信,有几种实现方式?

像我一样的小白或许刚好学了Props,此时一股脑将所有的属性写在B组件的Props中,这个方案固然可行,但是如果C组件下面还有组件呢?C的子孙千千万,B的Props中的属性也将变成千千万。不得不说B作为父亲的压力是真的大,不仅仅要养活C,还要养活C将来可能存在的千万子孙。这种解决方案无疑给后续的代码维护造成了比较大的阻碍。
或许学完了Props的小伙伴们又说了,那我们是不是可以借助其它工具?例如VueX这样的工具来实现,没错!VueX当然也可以实现以上场景,但是如果C中会用到的属性值很少,那么此时使用VueX来介入这样的问题,是否有点 ‘大动干戈’ 了呢?

能够解决(父→子)通信这类问题的手段有很多,正所谓没有最好的解决方案, 只有更适合的解决方案。在本文中主要踢一下$attrs这个API的使用。

怎么使用$attrs?
在vue2.4中,为了更好的解决上面这类场景的问题,引入了$attrs这一API来帮助咱开发者来解决这个问题。话不多说上代码:

 

<!-- 爷爷组件A -->
<template>
  <div>
    <my-father :foo="foo"
      :bar="bar"
      :fatherName="'老王'"
      :sonName="'小王'">
    </my-father>
  </div>
</template>
<script>
import MyFather from "./MyFather.vue";
export default {
  components: {
    MyFather,
  },
  data () {
    return {
      foo: "foo",
      bar: "bar",
    };
  },
};
</script>
<!-- 父亲组件B -->
<template>
  <div>
    <p>----------------------------</p>
    <p>father中的foo:{{ foo }}</p>
    <p>father中的attrs: {{ $attrs }}</p>
    <my-son v-bind="$attrs"></my-son>
  </div>
</template>
<script>
import MySon from "./MySon.vue";
export default {
  props: ["foo", "fatherName"],
  components: {
    MySon,
  },
  created () {
    console.log('father组件中的$attrs:', this.$attrs);
  }
};
</script>
<!-- 孙子组件C -->
<template>
  <div>
    <p>----------------------------</p>
    <p>son中的bar:{{ bar }}</p>
    <p>son中的$attrs:{{ $attrs }}</p>
  </div>
</template>
<script>
export default {
  props: ["bar"],
  created () {
    console.log('son组件中的$attrs:', this.$attrs);
  }
};
</script>

页面显示如下:

从上面程序运行的结果, 相信能够看到$attrs的威力了, 它能够让咱们在解决父子通信、爷孙通信这类问题场景的时候更加优雅。毕竟优雅永不过时嘛

$listeners
爷爷 → 孙子 讲完了, 接下来看看咱们如何优雅地解决 爷爷 ← 孙子 的问题。

为什么要用$listenners?
场景: 现在组件之间的结构如最上面的图所示,我们要实现由C组件到A组件之间的数据通信,有几种实现方式?

可以在C组件中使用$emit()方法, 抛出一个事件给B组件, B组件再调用$emit()方法抛给A组件, 像这样一层一层往上传递。在组件关系、组件功能都不复杂的情况下,使用这种方法可以快速完成子组件到父组件之间的通信。
通过VueX来实现父子组件通信
父组件通过ref来调用子组件的方法
 

 

能够解决(父←子)通信这类问题的手段有很多,正所谓没有最好的解决方案, 只有更适合的解决方案。接下来主要踢一下$listenners这个API的使用。

怎么使用$listenners?

话不多说, 上代码:

<!-- 爷爷组件A -->
<template>
  <div>
    <my-father :foo="foo" @updateFoo="update" />
  </div>
</template>
<script>
import MyFather from "./MyFather.vue";
export default {
  components: {
    MyFather,
  },
  data () {
    return {
      foo: "foo",
    };
  },
  methods: {
    update (newValue) {
      this.foo = newValue
      console.log("update success");
    }
  }
};
</script>
<!-- 父亲组件B -->
<template>
  <div>
    <p>father中的foo:{{ foo }}</p>
    <my-son v-bind="$attrs" v-on="$listeners" />
  </div>
</template>
<script>
import MySon from "./MySon.vue";
export default {
  props: ["foo"],
  inheritAttrs: false,
  components: {
    MySon,
  },
};
</script>
<!-- 孙子组件C -->
<template>
  <div>
    <button @click="sonFun">更新foo</button>
  </div>
</template>
<script>
export default {
  props: ["bar"],
  methods: {
    sonFun () {
      this.$emit("updateFoo", "oof");
      console.log("sonFun!!!");
    }
  }
};
</script>

通过观察我们发现, 由C组件到A组件之间的通信仅用到了一次e m i t ( ) , 这一小小的举动让我们的组件通信变得更加优雅了 , 我们只需要在 B 组件使用 C 组件的地方加上一句 ‘ v − o n = " emit(), 这一小小的举动让我们的组件通信变得更加优雅了, 我们只需要在B组件使用C组件的地方加上一句`v-on="emit(),这一小小的举动让我们的组件通信变得更加优雅了,我们只需要在B组件使用C组件的地方加上一句‘v−on="listeners"`就可以让A组件监听到C组件抛出的事件。看完本文后是否对$attrs 和 $listenners 有了深刻的认识呢?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/332856.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《Python数据分析技术栈》第01章 02 Jupyter入门(Getting started with Jupyter notebooks)

02 Jupyter入门&#xff08;Getting started with Jupyter notebooks&#xff09; 《Python数据分析技术栈》第01章 02 Jupyter入门&#xff08;Getting started with Jupyter notebooks&#xff09; Before we discuss the essentials of Jupyter notebooks, let us discuss…

VSCode使用Makefile Tools插件开发C/C++程序

提起Makefile&#xff0c;可能有人会觉得它已经过时了&#xff0c;毕竟现在有比它更好的工具&#xff0c;比如CMake&#xff0c;XMake&#xff0c;Meson等等&#xff0c;但是在Linux下很多C/C源码都是直接或者间接使用Makefile文件来编译项目的&#xff0c;可以说Makefile是基石…

RT Thread Stdio生成STM32L431RCT6工程后如何修改外部时钟

一、简介 RT Thread Stdio生成STM32L431RCT6工程后默认为内部时钟&#xff0c;如何修改为外部时钟呢&#xff1f; 二、修改时钟步骤 本方案修改外部时钟为直接修改代码&#xff0c;不通过STM32CubeMX 进行配置&#xff08;使用这个软件会编译出错&#xff09; &#xff08;…

AEB滤镜再破碎,安全焦虑「解不开」?

不久前&#xff0c;理想L7重大交通事故&#xff0c;再次引发了公众对AEB的热议。 根据理想汽车公布的事故视频显示&#xff0c;碰撞发生前3秒&#xff0c;车速在178km/h时驾驶员采取了制动措施&#xff0c;但车速大幅超出AEB&#xff08;自动紧急刹车系统&#xff09;的工作范…

为什么 Golang Fasthttp 选择使用 slice 而非 map 存储请求数据

文章目录 Slice vs Map&#xff1a;基本概念内存分配和性能Fasthttp 中的 SliceMap性能优化的深层原因HTTP Headers 的特性CPU 预加载特性 结论 Fasthttp 是一个高性能的 Golang HTTP 框架&#xff0c;它在设计上做了许多优化以提高性能。其中一个显著的设计选择是使用 slice 而…

用sdkman在linux上管理多个java版本

概述&#xff1a; SDKMAN 是一个用于管理软件开发工具的工具&#xff0c;允许您轻松地安装、升级和切换不同版本的 JDK、Maven、Gradle 等工具。以下是在 Linux 上安装 SDKMAN! 的基本步骤&#xff1a; 安装SdkMan 使用 curl 安装 SDKMAN!: 打开终端&#xff0c;并运行以下命…

SpringCloud之Nacos

一、微服务介绍 1. 什么是微服务 2014年,Martin Fowler(马丁福勒 ) 提出了微服务的概念,定义了微服务是由以单一应用程序构成的小服务,自己拥有自己的进程与轻量化处理,服务依业务功能设计,以全自动的方式部署,与其他服务使用 HTTP API 通信。同时服务会使用最小的规模…

eNSP学习——配置通过Telnet登陆系统

实验内容&#xff1a; 模拟公司网络场景。R1是机房的设备&#xff0c;办公区与机房不在同一楼层&#xff0c;R2和R3模拟员工主机&#xff0c; 通过交换机S1与R1相连。 为了方便用户的管理&#xff0c;需要在R1上配置Telnet使员工可以在办公区远程管理机房设备。 为…

德施曼智能锁×去哪儿跨界联名,送你一场说走就走的新年旅行~

2024年农历新年即将来临&#xff0c;智能锁行业领军企业德施曼携手中国领先在线旅游平台去哪儿&#xff0c;紧扣“旅游过年”的新年趋势&#xff0c;推出“新年去哪儿&#xff0c;德施曼替你看家”跨界联名活动&#xff0c;为广大用户带来一场说走就走的旅行。 德施曼X去哪儿 …

学习笔记之——3D Gaussian SLAM,SplaTAM配置(Linux)与源码解读

SplaTAM全称是《SplaTAM: Splat, Track & Map 3D Gaussians for Dense RGB-D SLAM》&#xff0c;是第一个&#xff08;也是目前唯一一个&#xff09;开源的用3D Gaussian Splatting&#xff08;3DGS&#xff09;来做SLAM的工作。 在下面博客中&#xff0c;已经对3DGS进行了…

让CHAT对springSecurity原理进行简述

CHAT回复&#xff1a;Spring Security是Spring框架中用于实现认证和授权功能的安全框架。其主要原理基于Filter机制&#xff0c;可以实现基于角色或者资源URL的访问控制。 具体来说&#xff0c;Spring Security通过一系列的Filter对Web请求进行拦截&#xff0c;然后根据用户提供…

短视频代运营抖音项目规划管理计划模板

【干货资料持续更新&#xff0c;以防走丢】 短视频代运营抖音项目规划管理计划模板 部分资料预览 资料部分是网络整理&#xff0c;仅供学习参考。 短视频代运营模板&#xff08;完整资料包含以下内容&#xff09; 目录 具体的表格设计和内容可能因不同的情况和需求而有所变…

基于YOLOv8深度学习的葡萄簇目标检测系统【python源码+Pyqt5界面+数据集+训练代码】目标检测、深度学习实战

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

k8s------Pod、Label、NameSpace

一、Pod: Kubernetes中的最小调度对象 1.1 说明 Pod(容器组)是k8s创建和调度的最小单元。一个Pod封装多个容器(container)、存储资源(volume)、一个独立网络ip和管理控制容器运行方式。 Pod可以单独运行一个容器&#xff0c;也可以兼容多个容器运行&#xff0c;多个容器共享…

CentOS 7.9 安装图解

特特特别的说明 CentOS发行版已经不再适合应用于生产环境&#xff0c;客观条件不得不用的话&#xff0c;优选7.9版本&#xff0c;8.5版本次之&#xff0c;最次6.10版本&#xff08;比如说Oracle 11GR2就建议在6版本上部署&#xff09;&#xff01; 引导和开始安装 选择倒计时结…

CS架构抓包——Fiddler+ Proxifier

Fiddler 1、配置好fiddler作为代理服务器的端口号&#xff0c;允许https代理 捕获https连接 fiddler在端口侦听8888端口&#xff0c;捕获http请求 Proxifier 1、proxifier允许启用http代理服务器 2、CS客户端添加代理服务器的IP地址及端口号 3、添加代理规则&#xff1a;使用f…

警惕!Citrix NetScaler ADC 和 NetScaler Gateway漏洞风险通告

近日&#xff0c;亚信安全CERT监控到Citrix发布了NetScaler ADC 和 NetScaler Gateway的安全公告&#xff0c;披露了2个安全漏洞CVE-2023-6548和CVE-2023-6549。其中CVE-2023-6548为远程代码执行漏洞&#xff0c;该漏洞可导致 NetScaler 管理接口和未修复的NetScaler 实例易遭远…

第5章 现代通信网

文章目录 5.1 通信网概述5.1.1 通信网的构成要素5.1.2 通信网的发展演进 5.2 交换与控制5.2.1 交换的基本概念1、电路交换2、报文交换3、分组交换4、3种交换技术的比较 5.2.2 IP交换1、IP交换机的构成2、IP 交换的工作原理 5.2.3 IP多媒体子系统 5.3 传输网5.3.1 有线传输1、光…

将x, y, z 列表变成 [x,y,z]格式

如下图所示表格 方法: //处理数据 将x y z 合并成[x,y,z]let dealData (xList, yList, zList) > {let result []for(let i 0; i < yList.length; i){for(let j 0; j < xList.length; j){result.push([xList[j],yList[i], zList[i*yList.length j]])}}return re…

2024 CKA 题库 | 11、创建 PVC

不等更新题库 文章目录 11、创建 PVC题目:考点&#xff1a;参考链接:解答:更换 context创建 pvc创建 pod修改 pvc 并记录 11、创建 PVC 题目: 设置配置环境&#xff1a; [candidatenode-1] $ kubectl config use-context ok8sTask 创建一个新的 PersistentVolumeClaim&#x…