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

$attrs学习

一、什么是 $attrs 

$attrs 用于实现当前组件的父组件,向当前组件的子组件通信(祖 ↔ 孙),也是一种通信方式。

具体说明:$attrs 是一个对象,包含所有父组件传入的标签属性。

注意:$attrs4 会自动排除 props 中声明的属性(可以认为声明过的 props 被子组件自己“消费”了)

 在 Vue 3 中,$attrs 是一个非常有用的特性,它包含了组件的所有“非 props”属性和事件。这对创建泛用组件(如包装器组件或高阶组件)非常有帮助,允许将未声明的属性自动传递给子组件。

使用场景

  • 创建包装组件,允许将原始组件的属性直接传递下去。
  • 处理动态属性的情况,而不必逐个声明 props。
  • 结合 v-bind="$attrs" 自动绑定属性。
<!-- 父组件 -->
<ChildComponent name="张三" age="18" title="学生" /><!-- 子组件 ChildComponent -->
<script>
export default {props: ['name'] // 只声明接收了 name,但是还有 age,title没有被接收
} // 此时子组件的 $attrs 会是:{ age: '18', title: '学生' }
</script>

二、v-bind="$attrs" 的作用

v-bind="$attrs" 等价于将 $attrs 中的所有属性通过 v-bind 批量绑定到某个元素或子组件上,实现属性的 “透传”。结合 v-bind="$attrs"自动绑定属性。

<!-- 写法1:手动绑定:将剩下的两个属性 手动绑定  -->
<GrandChildComponent :age="age" :title="title" /><!-- 写法2:使用 $attrs 批量绑定 直接使用 $attrs -->
<GrandChildComponent v-bind="$attrs" />

三、流程示例

当需要跨多层组件传递属性时,v-bind="$attrs" 可以避免逐层手动传递 props,简化代码。深层次的传递参数时好用。

<!-- 父组件 Parent -->
<template><div><!-- 向子组件传递3个属性 --><ChildComponent name="张三" age="18" title="学生" />  // 子组件</div>
</template><!-- 子组件 ChildComponent -->
<template><div><!-- 子组件不关心 age 和 title,通过 $attrs 透传给孙组件 --><GrandChildComponent v-bind="$attrs" />  // 孙组件</div>
</template>
<script>
export default {props: ['name'], // 子组件只接收 name,其余属性会进入 $attrsmounted() {console.log(this.$attrs); // { age: '18', title: '学生' }}
}
</script><!-- 孙组件 GrandChildComponent -->
<template><div><p>年龄:{{ age }}</p><p>标题:{{ title }}</p></div>
</template>
<script>
export default {props: ['age', 'title'] // 直接接收透传过来的属性
}
</script>

流程梳理:

  1. 父组件向 ChildComponent 传递 nameagetitle 三个属性。
  2. ChildComponent 只通过 props 接收 name,剩余的 age 和 title 自动存入 $attrs
  3. ChildComponent 通过 v-bind="$attrs" 将 $attrs 中的属性批量传递给 GrandChildComponent
  4. GrandChildComponent 通过 props 接收 age 和 title,完成属性透传。

本质流程:

父组件传递属性 → 中间组件通过 $attrs 收集未声明的属性 → 用 v-bind="$attrs" 透传给子组件 → 子组件通过 props 接收

通过这种方式,可以避免在中间组件中冗余声明不需要的 props,让代码更简洁、维护性更高。


文章转载自:

http://i9mQA4q4.npcxk.cn
http://78Ku9eTx.npcxk.cn
http://Tbd1U9xi.npcxk.cn
http://aYjePENE.npcxk.cn
http://nmFVpHK8.npcxk.cn
http://lqNZE4tO.npcxk.cn
http://Liei1pnT.npcxk.cn
http://MiwPzrQs.npcxk.cn
http://AdgCrEA6.npcxk.cn
http://6qS9lXxd.npcxk.cn
http://Kgmf8axI.npcxk.cn
http://kYTQWaKn.npcxk.cn
http://glSEeutg.npcxk.cn
http://p4aKDHMt.npcxk.cn
http://cfY5eBR0.npcxk.cn
http://HOQdiNmZ.npcxk.cn
http://Z1SpdAAn.npcxk.cn
http://hByalQAP.npcxk.cn
http://6WxIHwUG.npcxk.cn
http://yw739ZZJ.npcxk.cn
http://ppUXMkyu.npcxk.cn
http://TGGgzB0g.npcxk.cn
http://T9TBASNN.npcxk.cn
http://fMKX8xBn.npcxk.cn
http://GEpasfiB.npcxk.cn
http://5ejzqOKf.npcxk.cn
http://dVLIvSF9.npcxk.cn
http://e3mxL4K2.npcxk.cn
http://7VIdWLvm.npcxk.cn
http://24r9CHCj.npcxk.cn
http://www.dtcms.com/a/367870.html

相关文章:

  • 无定位更安全:5G 高清视频终端的保密场景适配之道
  • GitHub 热榜项目 - 日榜(2025-09-05)
  • 一文看懂什么是GaN HEMT以及其工艺流程(氮化镓高电子迁移率晶体管)
  • 【AI编程工具】快速搭建图书管理系统
  • 安卓学习 之 EditText 控件
  • 2025职教技能大赛汽车制造与维修赛道速递-产教融合实战亮剑​
  • java面试中经常会问到的zookeeper问题有哪些(基础版)
  • 光伏项目无人机踏勘--如何使用无人机自动航线规划APP
  • jenkins加docker 部署项目
  • linux离线安装elasticsearch8.19.3
  • Jenkins环境搭建与使⽤
  • Jenkins 监控方案:Prometheus + Grafana 实践
  • 【论文阅读】Security of Language Models for Code: A Systematic Literature Review
  • 神经网络算法各种层的原理(基于Keras)--输入层,全连接层,卷积层,池化层,嵌入层,长短期记忆网络层等
  • Github | MoneyPrinterTurbo:自动化视频内容生成系统
  • JUnit入门:Java单元测试全解析
  • 如何下载B站视频,去水印,翻译字幕
  • 脚本语言的大浪淘沙或百花争艳
  • Redis中的hash数据类型
  • 如何安全地删除与重建 Elasticsearch 的 .watches 索引
  • HDFS存储农业大数据的秘密是什么?高级大豆数据分析与可视化系统架构设计思路
  • uni-app iOS 文件调试常见问题与解决方案:结合 itools、克魔、iMazing 的实战经验
  • 解析豆科系统发育冲突原因
  • 五分钟XML速成
  • 《LangChain从入门到精通》系统学习教材大纲
  • 华为云 OBS:数字时代的数据存储与价值挖掘利器
  • Claude Code PM 深度实战指南:AI驱动的GitHub项目管理与并行协作
  • paimon实战 -- 阿里基于StarRocks 与 Paimon 实现的实时分析黑科技
  • 开源定时器教程:Quartz与XXL-JOB全面对比与实践
  • Day21_【机器学习—决策树(3)—剪枝】