当前位置: 首页 > news >正文

【Vue】Vue3.0(二十三)Vue3.0中$attrs 的概念和使用场景

文章目录

      • 一、$attrs的概念和使用场景
        • 概念
        • 使用场景
      • 二、代码解释
        • Father.vue
        • Child.vue
        • GrandChild.vue
      • 三、另一个$attrs使用的例子

一、$attrs的概念和使用场景

概念

在Vue 3.0中,$attrs是一个组件实例属性,它包含了父组件传递给子组件的所有非props属性。这里的非props属性是指那些父组件传递过来但子组件没有通过props显式定义来接收的属性。当父组件向子组件传递数据时,$attrs就像是一个“属性收集器”,自动收集这些未被props接收的属性,以便在组件内部或继续向下传递给更深层的子组件时使用。

使用场景
  • 多层组件嵌套中的属性透传:在多层嵌套的组件结构中,经常会遇到父组件的某些属性需要传递给更深层的子组件,但中间的一些组件并不需要使用这些属性的情况。此时,就可以利用$attrs来实现属性的“穿透式”传递,无需在每个中间组件都去定义props来接收和再次传递这些属性,大大简化了多层组件间数据传递的流程。
  • 动态属性传递:当需要动态地向子组件传递一些属性,且这些属性的具体内容可能会根据不同的业务场景或用户操作而变化时,使用$attrs会很方便。因为不需要提前在子组件中为每一个可能传递的属性都定义好props,只需要在父组件传递时将相关属性附上,子组件通过$attrs就能获取到这些动态传递的属性。

二、代码解释

代码:

Father.vue
<template><div class="father"><h3>父组件</h3><h4>a:{{ a }}</h4><h4>b:{{ b }}</h4><h4>c:{{ c }}</h4><h4>d:{{ d }}</h4><!-- 下面这行中的v-bind可以传对象,比如下面传递了一个{x:100,y:200}那就相当于给子组件传递了两个props属性,一个是x,一个是y 然后下面子组件中去接收就行 --><Child:a="a":b="b":c="c":d="d"  v-bind="{x:100,y:200}":updateA='updateA'/></div>
</template><script setup lang="ts" name="Father">
import Child from './Child.vue'
import { ref } from 'vue'let a = ref(1)
let b = ref(2)
let c = ref(3)
let d = ref(4)function updateA(value: number) {a.value += value
}
//测试一下在自己的组件中只定义的变量是否会被放在$attrs中
const productId = ref(123);
const productName = ref('Awesome Product');
const productImage = ref('product-image.jpg');
</script><style scoped>
.father {background-color: rgb(165, 164, 164);padding: 20px;border-radius: 10px;
}
</style>
  • Father.vue组件的模板部分,通过属性绑定的方式向Child组件传递了多个属性,包括abcd以及一个通过v-bind绑定的对象{x:100,y:200},还有updateA函数。在脚本部分,定义了abcd这几个ref类型的响应式数据,并初始化了相应的值,同时定义了updateA函数用于更新a的值。
Child.vue
<template><div class="child"><h3>子组件</h3><h4>a:{{a}}</h4><h4>b:{{b}}</h4><h4>其他:{{$attrs}}</h4><!-- 下面这行相当于传递了很多props给子组件 --><GrandChild v-bind="$attrs" /></div>
</template><script setup lang="ts" name="Child">
import GrandChild from './GrandChild.vue'
// defineProps(['a','b'])  //我现在对于父传过来的属性一个也不想使用,所以传过来的这些都在$attrs中,直接将这些传递给这个组件的子组件,也就是孙子组件
</script><style scoped>
.child {margin-top: 20px;background-color: skyblue;padding: 20px;border-radius: 10px;box-shadow: 0 0 10px black;
}
</style>
  • Child.vue的模板部分,展示了ab的值(这里假设是为了示意可以获取到这些值,虽然在实际代码逻辑中作者提到不想使用这些属性),并通过v-bind="$attrs"$attrs中的所有属性传递给了GrandChild组件。在脚本部分,虽然定义了defineProps(['a','b']),但作者表示本意是不想使用父组件传递过来的这些属性,所以实际上这些属性还是会被放到$attrs中继续向下传递。
GrandChild.vue
<template><div class="grand-child"><h3>孙组件</h3><h4>a:{{ a }}</h4><h4>b:{{ b }}</h4><h4>c:{{ c }}</h4><h4>d:{{ d }}</h4><h4>x:{{ x }}</h4><h4>y:{{ y }}</h4><button @click="updateA(6)">点我将爷爷那的a更新</button> <button @click="mybutton">点我试一试</button></div>
</template><script setup lang="ts" name="GrandChild">
import {ref} from 'vue'
const {c} =defineProps(['a', 'b', 'c', 'd','x','y','updateA'])function mybutton(){console.log('@@',c);}
</script><style scoped>
.grand-child {margin-top: 20px;background-color: orange;padding: 20px;border-radius: 10px;box-shadow: 0 0 10px black;
}
</style>
  • GrandChild.vue的模板部分,展示了从父组件(通过$attrs传递过来)的abcdxy等属性的值,并且有一个按钮,点击该按钮会调用updateA(6)函数,这个函数是从父组件传递过来的,用于更新Father.vue组件中a的值。在脚本部分,通过defineProps(['a', 'b', 'c', 'd','x','y','updateA'])正确地接收了从父组件传递过来的这些属性,使得在模板中能够正常使用它们。

三、另一个$attrs使用的例子

假设我们有一个电商应用场景,有一个ProductPage组件(产品页面组件),它包含一个ProductDetails组件(产品详情组件)和一个ProductReviews组件(产品评论组件)。ProductPage组件会接收到一些关于产品的通用属性,如productIdproductName等,这些属性需要传递给ProductReviews组件,但ProductDetails组件并不需要使用这些属性。

  • ProductPage.vue组件
<template><div class="product-page"><ProductDetails :productImage="productImage" /><ProductReviews v-bind="{productId:productId,productName:productName,productImage:productImage}" /></div></template><script setup lang="ts" name="ProductPage">import ProductDetails from './ProductDetails.vue';import ProductReviews from './ProductReviews.vue';import { ref } from 'vue';const productId = ref(123);const productName = ref('Awesome Product');const productImage = 'https://images.dog.ceo//breeds//pembroke//n02113023_11091.jpg'</script><style scoped>.product-page {padding: 20px;}</style>
  • ProductDetails.vue组件
<template><div class="product-details"><img :src="productImage" alt="Product Image"><h2>Product Details</h2><h4>{{productImage}}</h4></div></template><script setup lang="ts" name="ProductDetails">import { ref } from 'vue';import { defineProps } from 'vue';// const productImage = ref('');defineProps(['productImage'])</script><style scoped>.product-details {background-color: lightgray;padding: 10px;}</style>
  • ProductReviews.vue组件
<template><div class="product-reviews"><h2>Product Reviews</h2><!-- <h4>{{$attrs}}</h4> --><p>Product ID: {{ productId }}</p><p>Product Name: {{ productName }}</p><button @click="fetchReviews">Fetch Reviews</button></div></template><script setup lang="ts" name="ProductReviews">import { onMounted, ref, toRefs,defineProps } from 'vue';
const {productId,productName} =defineProps(['productId','productName'])//   onMounted(() => {
//   const attrs = $attrs;
//   ({ productId, productName } = toRefs(attrs));
// });
//   // const { productId, productName } = toRefs($attrs);const fetchReviews = () => {// 这里可以根据productId去获取对应的产品评论数据等操作console.log(`Fetching reviews for product`,productId);};</script><style scoped>.product-reviews {background-color: lightyellow;padding: 10px;}</style>

在这个例子中,ProductPage组件将productIdproductName等属性通过$attrs传递给了ProductReviews组件,而ProductDetails组件不需要处理这些属性,实现了在电商应用场景下组件间属性的合理传递。

相关文章:

【Vue】Vue3.0(二十三)Vue3.0中$attrs 的概念和使用场景

文章目录 一、$attrs的概念和使用场景概念使用场景 二、代码解释Father.vueChild.vueGrandChild.vue 三、另一个$attrs使用的例子 一、$attrs的概念和使用场景 概念 在Vue 3.0中&#xff0c;$attrs是一个组件实例属性&#xff0c;它包含了父组件传递给子组件的所有非props属性…...

RHEL/CENTOS 7 ORACLE 19C-RAC安装(纯命令版)

一 首先需要安装两个CENTOS 7虚拟机(此处省略)。 由于我们是要安装ORCLE-RAC双节点集群所以至少每个CENTOS虚拟机上需要两块网卡&#xff0c;并且两块网卡都是HOST-ONLY具体步骤请看视频一《为虚拟机添加网卡》 这里大家需要注意的是&#xff0c;我们需要绑定两台机器的IP一共…...

CCSK:面试云计算岗的高频问题

在竞争激烈的云计算岗位求职市场中&#xff0c;拥有 CCSK云计算安全知识认证无疑能为你增添强大的竞争力。而深入了解云计算面试中的高频问题并熟练掌握答案&#xff0c;更是迈向成功的关键一步。 一、AWS 相关问题 AWS 是重要考点&#xff0c;常被问到其关键特性&#xff0c…...

C++ String(1)

String的头文件是#include <string> String本质上是一个类&#xff0c;是C实现好的一个类 初学只用学重要的部分&#xff0c;不可能一次性全部学完 1.构造函数 我们先来看它的几个构造函数 首先&#xff08;1&#xff09;就是无参的构造 &#xff08;2&#xff09;是…...

ts 中 ReturnType 作用

ReturnType 用于获取函数的返回值类型。 一、基本概念和语法 1. 定义和语法结构 ReturnType是一个泛型类型&#xff0c;其语法为ReturnType<T>&#xff0c;其中T是一个函数类型。例如&#xff0c;如果有一个函数add&#xff0c;ReturnType<typeof add>就可以获取…...

Hadoop + Hive + Apache Ranger 源码编译记录

背景介绍 由于 CDH&#xff08;Clouderas Distribution Hadoop &#xff09;近几年已经开始收费并限制节点数量和版本升级&#xff0c;最近使用开源的 hadoop 搭了一套测试集群&#xff0c;其中的权限管理组件用到了Apache Ranger&#xff0c;所以记录一下编译打包过程。 组件…...

Java从入门到精通笔记篇(十二)

枚举类型与泛型 枚举类型可以取代以往常量的定义方式&#xff0c;即将常量封装在类或接口中 使用枚举类型设置常量 关键字为enum 枚举类型的常用方法 values()方法 枚举类型实例包含一个values()方法&#xff0c;该方法将枚举中所有的枚举值以数组的形式返回。 valueOf()可…...

入侵排查之Linux

目录 1.黑客入侵后的利用思路 2.入侵排查思路 2.1.账号安全 2.1.1.用户信息文件/etc/passwd 2.1.2.影子文件/etc/shadow 2.1.3.入侵排查 2.1.3.1.排查当前系统登录信息 2.1.4.2.查询可以远程登录的账号信息 2.2.历史命令 2.2.1.基本使用 2.2.1.1.root历史命令 2.2.…...

从0开始学习Linux——文件管理

往期目录&#xff1a; 从0开始学习Linux——简介&安装 从0开始学习Linux——搭建属于自己的Linux虚拟机 从0开始学习Linux——文本编辑器 从0开始学习Linux——Yum工具 从0开始学习Linux——远程连接工具 从0开始学习Linux——文件目录 从0开始学习Linux——网络配置 从0开…...

全面介绍软件安全测试分类,安全测试方法、安全防护技术、安全测试流程

一、软件系统设计开发运行安全 1、注重OpenSource组件安全检查和版本更新&#xff08;black duck&#xff09; 现在很多云、云服务器都是由开源的组件去搭成的&#xff0c;对于OpenSource组件应该去做一些安全检查和版本更新&#xff0c;尤其是版本管理&#xff0c;定期对在运…...

Leidenアルゴリズムの詳細解説:Pythonによるネットワーク分割の実装

Leidenアルゴリズムの詳細解説&#xff1a;Pythonによるネットワーク分割の実装 目次1. Leidenアルゴリズムの概要2. Python実装例3. グループ分けの結果分析4. なぜこのような分割になるのか5. Leidenアルゴリズムの仕組み6. 実践的な応用例7. 初心者へのアドバイス8. まとめ …...

安当ASP系统:适合中小企业的轻量级Radius认证服务器

安当ASP&#xff08;Authentication Service Platform&#xff09;身份认证系统是一款功能强大的身份认证服务平台&#xff0c;特别适用于中小企业。其中&#xff0c;简约型Radius认证服务器是安当ASP系统中的一个重要组成部分。以下是对该系统的详细介绍&#xff1a; 一、主要…...

Vue 组件间传值指南:Vue 组件通信的七种方法

前言 Vue 的组件系统非常强大&#xff0c;允许我们将应用程序拆分成独立且可复用的组件。随着前端开发的复杂性增加&#xff0c;组件间的数据传递和状态管理显得尤为重要。本文将详细介绍几种在 Vue 中常用的组件间传值方法&#xff0c;并结合实际代码示例&#xff0c;帮助您更…...

推荐一个超漂亮ui的网页应用设计

https://andi.cn/download/65211.html...

有什么初学算法的书籍推荐?

对于初学算法的读者&#xff0c;以下是一些值得推荐的书籍&#xff1a; 1、算法超简单&#xff1a;趣味游戏带你轻松入门与实践 作者&#xff1a;童晶 著 推荐理由&#xff1a;本书把趣味游戏应用于算法教学&#xff0c;提升读者的学习兴趣&#xff0c;并通过可视化的图解和动…...

自动化工作流建设指南

&#x1f680; 自动化工作流建设指南&#xff1a;CI/CD、Github Actions与自动化测试部署 打造现代化的自动化工作流&#xff0c;提升团队开发效率。今天咱们将深入探讨 CI/CD 最佳实践、Github Actions 实战经验以及自动化测试与部署策略。 &#x1f4d1; 目录 CI/CD 最佳实践…...

[免费]SpringBoot+Vue3校园宿舍管理系统(优质版)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的SpringBootVue3校园宿舍管理系统(优质版)&#xff0c;分享下哈。 项目视频演示 【免费】SpringBootVue3校园宿舍管理系统(优质版) Java毕业设计_哔哩哔哩_bilibili 项目介绍 随着信息技术的不断发展&…...

SNK施努卡 - 机器人测温取样系统

机械手测温取样系统 有色行业自动化 机器人&#xff1a;机械手测温取样系统是以工业机器人为平台&#xff0c;技术相对成熟稳定&#xff0c;利用机器人的灵活性&#xff0c;自动往测温取样枪上安装探头&#xff0c;自动将探头伸进高温铜水内进行测温取样&#xff0c;自动拆除废…...

goframe开发一个企业网站 验证码17

Go验证码功能实现详解 目录结构 ├── internal │ ├── controller │ │ └── captcha │ │ └── captcha.go │ ├── logic │ │ └── captcha │ │ └── captcha.go │ └── service │ └── captcha.go1. Serv…...

【JavaEE初阶 — 多线程】单例模式 & 指令重排序问题

目录 1. 单例模式 (1) 饿汉模式 (2) 懒汉模式 1. 单线程版本 2. 多线程版本 2. 解决懒汉模式产生的线程安全问题 (1) 产生线程安全的原因 (2) 解决线程安全问题 1. 通过加锁让读写操作紧密执行 方法一 方法二 2. 处理加锁引入的新问题 问题描述 …...

OBS高级计时器插件:6种专业模式让你的直播时间管理轻松自如

OBS高级计时器插件&#xff1a;6种专业模式让你的直播时间管理轻松自如 【免费下载链接】obs-advanced-timer 项目地址: https://gitcode.com/gh_mirrors/ob/obs-advanced-timer 还在为直播时间控制而烦恼吗&#xff1f;OBS Advanced Timer计时器插件是你的直播时间管理…...

Flut Renamer:免费跨平台批量文件重命名工具的完整使用指南

Flut Renamer&#xff1a;免费跨平台批量文件重命名工具的完整使用指南 【免费下载链接】renamer Flut Renamer - A bulk file renamer written in flutter (dart). Available on Linux, Windows, Android, iOS and macOS. 项目地址: https://gitcode.com/gh_mirrors/ren/ren…...

EASY-HWID-SPOOFER:3分钟学会硬件信息伪装终极指南

EASY-HWID-SPOOFER&#xff1a;3分钟学会硬件信息伪装终极指南 【免费下载链接】EASY-HWID-SPOOFER 基于内核模式的硬件信息欺骗工具 项目地址: https://gitcode.com/gh_mirrors/ea/EASY-HWID-SPOOFER 在当今数字时代&#xff0c;您的硬件标识就像是设备的"数字指纹…...

Taotoken API Key管理与审计日志功能的安全价值感知

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 Taotoken API Key管理与审计日志功能的安全价值感知 1. 引言 在团队协作开发中&#xff0c;将大模型能力集成到产品里已成为常见实…...

ChatGPT提示工程进阶实战(故事化表达失效的7大隐形陷阱)

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;故事化表达失效的底层认知重构 当工程师在技术文档中反复使用“用户点击按钮后&#xff0c;系统就像一位耐心的向导&#xff0c;带他走过三步旅程”这类修辞时&#xff0c;信息熵并未降低——反而因隐喻失准而…...

Oracle误操作先别慌:Flashback、UNDO、回收站、Redo 与归档日志一次讲清楚 2026-05-24

1、背景说明本文整理 Oracle 生产环境中误操作恢复相关的核心知识点&#xff0c;包括&#xff1a;Flashback Database Flashback Query UNDO Recycle Bin FRA 快速恢复区 Redo Archived Redo Log 归档日志适用于 Oracle 单实例、RAC&#xff0c;以及 CDB/PDB 多租户环境。在 CD…...

VMware Workstation Pro 17免费许可证密钥完整指南:快速激活专业虚拟化工具

VMware Workstation Pro 17免费许可证密钥完整指南&#xff1a;快速激活专业虚拟化工具 【免费下载链接】VMware-Workstation-Pro-17-Licence-Keys Free VMware Workstation Pro 17 full license keys. Weve meticulously organized thousands of keys, catering to all major …...

【Claude文档分析高阶战法】:3个被90%用户忽略的PDF/OCR/多语言混合解析技巧

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Claude文档分析高阶战法总览 Claude在处理长文本、结构化文档与跨段落语义推理方面展现出独特优势&#xff0c;但要释放其全部潜力&#xff0c;需超越基础提问&#xff0c;构建系统化的分析范式。本章聚…...

避开这些坑,你的孟德尔随机化分析结果才可靠:以口腔癌研究为例的实操避雷指南

孟德尔随机化分析实战避坑指南&#xff1a;从数据陷阱到稳健结论当你在深夜盯着屏幕上那个意义不明的0.6940093乘数&#xff0c;或是当MR-PRESSO分析结果始终无法收敛时&#xff0c;是否怀疑过自己的分析流程存在致命缺陷&#xff1f;孟德尔随机化&#xff08;MR&#xff09;作…...

高阶信息度量:总相关性与O信息在特征工程与数据压缩中的应用

1. 从信息论到机器学习&#xff1a;为什么我们需要更精细的“相关性”度量如果你做过机器学习项目&#xff0c;尤其是涉及高维数据特征工程或者模型解释性分析时&#xff0c;大概率会碰到一个头疼的问题&#xff1a;我们如何量化一组特征变量之间的“整体关系”&#xff1f;传统…...