vue3 透传 Attributes

vue3的深入组件-透传 Attributes click 监听器会被添加到 <MyButton> 的根元素,即那个原生的 <button> 元素之上。同样的,如果原生 button 元素自身也通过 v-on 绑定了一个事件监听器,则这个监听器和从父组件继承的监听器都会被触发。需要注意的是,虽然这里的 attrs 对象总是反映为最新的透传 attribute,但它并不是响应式的 (考虑到性能因素)。“透传 attribute”指的是传递给一个组件,却没有被该组件声明为 props 或 emits 的 attribute 或者 v-on 事件监听器。 阅读详情

前言

Vue 3 现在正式支持了多根节点的组件,也就是片段!

Vue 2.x 遵循单根节点组件的规则,即一个组件的模板必须有且仅有一个根元素。

为了满足单根节点的要求,开发者会将原本多根节点的内容包裹在一个<div>元素中:

<!-- Layout.vue -->
<template>
  <div>
    <h1>标题</h1>
    <p>段落</p>
  </div>
</template>

这是因为Vue 的编译器在解析组件模板时,是基于单根节点的树形结构进行处理的。如果存在多个根节点,编译器无法明确地构建组件的虚拟 DOM 结构。

因此,在Vue 2.x中,父组件在使用子组件时,写在子组件上的 class、style 和 id 等属性会直接传递到子组件的根元素上。

Vue 3.x 打破了 Vue 2.x 中组件模板必须有且仅有一个根元素的限制,现在组件可以包含多个根节点。

<template>
  <h1>标题</h1>
  <p>段落</p>
</template>

当组件存在多个根节点时,在父组件中给该组件传递属性(attribute)就需要明确指定这些属性应该绑定到哪个根节点上。如果不进行显式指定,Vue 无法确定属性的归属。

<template>
  <ChildComponent>
    <template v-slot:default="{ attrs }">
      <div v-bind="attrs">这是一个 div 根节点</div>
      <p>这是一个 p 根节点</p>
      <span>这是一个 span 根节点</span>
    </template>
  </ChildComponent>
</template>

在示例中,通过v-slot:default="{attrs}"获取到ChildComponent.vue通过插槽传递给父组件的所有属性(存储在attrs中),然后使用v-bind="attrs"将这些属性显式地绑定到其中一个根节点<div>上。

Attributes 继承

“透传 attribute”指的是传递给一个组件,却没有被该组件声明为 props 或 emits 的 attribute 或者 v-on 事件监听器。

当一个组件以单个元素为根作渲染时,透传的 attribute 会自动被添加到根元素上。

最常见的例子就是 class、style 和 id。

子组件ChildComponent.vue的模板内容如下:

<div>这是子组件的div</div>

在父组件使用子组件ChildComponent.vue,并且传入了 class、style 和 id:

<template>
  <div>
    <h1>父组件</h1>
    <ChildComponent class="child-div"  id="child-div"
      style="font-size: 20px; color: brown;" />
  </div>
</template>
<script setup lang="ts">
import ChildComponent from './ChildComponent.vue';
</script>

渲染出的DOM结果是:

<div class="child-div" id="child-div" style="font-size: 20px; color: brown">
  这是子组件的div
</div>

<ChildComponent> 并没有将 class、style 和 id声明为它所接受的 prop,所以 class、style 和 id被视作透传 attribute,自动透传到了 <ChildComponent> 的根元素上。

当 style 属性透传到子组件的根元素后,它的生效方式与直接在 HTML 元素上设置 style 属性是一样的:
在这里插入图片描述

自动合并 class 或 style

如果一个子组件的根元素已经有了 class 或 style attribute,它会和从父组件上继承的值合并。

给子组件ChildComponent.vue加上class、style、id属性:

<div
  class="child-box"
  id="child-box"
  style="padding: 15px; background-color: #f8f8f8"
>
  这是子组件的div
</div>

渲染出的DOM结果是:

<div
 class="child-box child-div"
  id="child-div"
  style="
    padding: 15px;
    background-color: rgb(248, 248, 248);
    font-size: 20px;
    color: brown;
  "
>
  这是子组件的div
</div>

子组件的class、style 属性值 和 从父组件上继承的值合并,子组件的 id 属性值被从父组件继承的 id 属性值覆盖。

页面渲染结果如下图:
在这里插入图片描述

v-on 监听器继承

子组件ChildComponent.vue的模板内容如下:

<div @click="console.log('子组件的点击事件被触发了')"> 这是子组件的div </div>

在父组件中,给<ChildComponent>绑定一个点击事件:

<template>
  <div class="home-wrap">
    <h1>父组件</h1>
    <ChildComponent @click="console.log('在父组件中,给子组件绑定的点击事件被触发了!')"/>
  </div>
</template>
<script setup lang="ts">
import ChildComponent from './ChildComponent.vue';
</script>

父组件中绑定的click 监听器会被添加到 <ChildComponent> 的根元素:子组件的 <div> 元素之上。
子组件的<div>元素自身也通过 v-on 绑定了一个事件监听器。

当点击子组件的<div>元素,子组件的click监听器和从父组件继承的监听器都会被触发:
在这里插入图片描述

深层组件继承

有些情况下一个组件会在根节点上渲染另一个组件。

当ChildComponent.vue的根节点渲染的是另一个组件GrandChild.vue时:

<!-- ChildComponent.vue 的模板,只是渲染另一个组件:<GrandChild /> -->
<template>
  <GrandChild />
</template>

此时 <ChildComponent> 接收的透传 attribute 会直接继续传给 <GrandChild>。

注意:

  1. 透传的 attribute 不会包含 <ChildComponent> 上声明过的 props 或是针对 emits 声明事件的 v-on 侦听函数,换句话说,声明过的 props 和侦听函数被 <ChildComponent> “消费”了。

  2. 透传的 attribute 若符合声明,也可以作为 props 传入 <GrandChild>。

禁用 Attributes 继承

在选项式API中,在组件选项中设置 inheritAttrs: false 可以禁止 组件自动地继承 attribute。

在组合式API中,在 <script setup> 中使用 defineOptions:

<script setup>
defineOptions({
  inheritAttrs: false
})
// ...setup 逻辑
</script>

通过设置 inheritAttrs 选项为 false,可以完全控制透传进来的 attribute 被如何使用。

注意:透传进来的 attribute 可以在模板的表达式中直接用 $attrs 访问到。

在ChildComponent.vue中,设置 inheritAttrs: false 并通过$attrs访问透传属性 customValue:

<!-- ChildComponent.vue 的模板 -->
<template>
  <div>在ChildComponent.vue中,读取透传 Attributes: {{ $attrs.customValue }}</div>
</template>
<script setup lang="ts">
defineOptions({
  inheritAttrs: false
})
</script>

在父组件中,使用子组件ChildComponent.vue,传递class属性、customValue属性:

<template>
  <div class="home-wrap">
    <h1>父组件</h1>
    <ChildComponent class="child-div" :customValue="customValue" />
  </div>
</template>
<script setup lang="ts">
import { ref } from 'vue';
import ChildComponent from './ChildComponent.vue';
const customValue = ref(10)
</script>

渲染出的DOM结果是:

<div>在ChildComponent.vue中,读取透传 Attributes: 10</div>

可以看到,父组件传的class属性并没有被直接透传到子组件的根元素上。

通过Vue Devtools查看$attrs,$attrs 包含了 透传进来的 class、customValue属性:
在这里插入图片描述
$attrs 对象包含了除组件所声明的 props 和 emits 之外的所有其他 attribute,例如 class,style,v-on 监听器等等。

  • 和 props 有所不同,透传 attributes 在 JavaScript 中保留了它们原始的大小写,所以像 foo-bar 这样的一个 attribute 需要通过 $attrs['foo-bar'] 来访问。

  • 像 @click 这样的一个 v-on 事件监听器将在此对象下被暴露为一个函数 $attrs.onClick。

通过设定 inheritAttrs: false 和使用 v-bind="$attrs" 来实现将 透传 attribute 应用在合适的元素上:

<!-- ChildComponent.vue 的模板 -->
<template>
  <div>
    <div v-bind:="$attrs">在ChildComponent.vue中,读取透传 Attributes: {{ $attrs.customValue }}</div>
  </div>
</template>
<script setup lang="ts">
defineOptions({
  inheritAttrs: false
})
</script>

渲染出的DOM结果是:

<div>
  <div class="child-div" customvalue="10">
    在ChildComponent.vue中,读取透传 Attributes: 10
  </div>
</div>

通过不带参数的 v-bind,将一个对象的所有属性都作为 attribute 应用到目标元素上。

多根节点的 Attributes 继承

和单根节点组件有所不同,有着多个根节点的组件没有自动 attribute 透传行为。如果 $attrs 没有被显式绑定,将会抛出一个运行时警告。

修改ChildComponent.vue:

<!-- ChildComponent.vue 的模板 -->
<template>
  <h2>ChildComponent的标题</h2>
  <div>ChildComponent的内容</div>
</template>

此时,ChildComponent.vue是多根节点模板,由于 Vue 不知道要将 attribute 透传到哪里,所以会抛出一个警告:

Extraneous non-props attributes (class, customValue) were passed to component but could not be automatically inherited because component renders fragment or text root nodes.

当ChildComponent.vue有多个根节点时,需要显式绑定 $attrs:

<!-- ChildComponent.vue 的模板 -->
<template>
  <h2 v-bind="$attrs">ChildComponent的标题</h2>
  <div>ChildComponent的内容</div>
</template>

在 JavaScript 中访问透传 Attributes

在选项式API中,attrs 会作为 setup() 上下文对象的一个属性暴露:

<script>
export default {
  setup(props, ctx) {
    // 透传 attribute 被暴露为 ctx.attrs,且 没有响应性
    console.log(ctx.attrs)
  }
}
</script>

在组合式API中,在 <script setup> 中使用 useAttrs() API 来访问一个组件的所有透传 attribute:

<script setup>
import { useAttrs } from 'vue'
const attrs = useAttrs()
</script>

有个疑问待解决:

官网说法:attrs 对象总是反映为最新的透传 attribute,但它没有响应性,不能通过侦听器去监听它的变化。

我直接在模板中使用$attrs,以及使用上述2种方式获取attrs,修改透传 attribute 后,页面也更新了。
所以没get到,官方说的attrs对象没有响应性是指哪方面。
知道为什么的童鞋可以在评论区讲一下或者是私信给我说一下,非常感谢!

从零掌握 Vue 3 useAttrs:属性透传的终极解决方案 通过实际项目案例,详细讲解 Vue 3 useAttrs 在组件开发中的应用。涵盖基础用法、高级技巧、性能优化和最佳实践,帮助开发者构建更加灵活和可维护的 Vue 组件库。 阅读详情

相关推荐

Vue3透传 Attributes($attrs)深度解析

父组件传递给子组件,但未被props或emits声明的属性包括:class和style普通 HTML 属性(如iddata-*原生 DOM 事件监听器(如@click。

monk all the way 1173

vue3-深入组件-透传属性

template Fallthrough attribute: {{ $attrs }} 这个 $attrs 对象包含了除组件所声明的 props 和 emits 之外的所有其他 attribute,例如 class,style,v-on 监听器等等。需要注意的是,虽然这里的 attrs 对象总是反映为最新的透传 attribute,但它并不是响应式的 (考虑到性能因素)。如果一个子组件的根元素已经有了 class 或 style attribute,它会和从父组件上继承的值合并。

wdk996的博客 1794

Vue 2和Vue 3透传Attributes特性

【代码】Vue 2和Vue 3透传Attributes特性。

qq_35876316的博客 1278

【Vue3实践】(四)优雅使用VUE3 组件特性:属性透传、依赖注入、组件插槽、动态组件

本篇主要讲了VUE3中组件的其他几个特性:属性透传、依赖注入、组件插槽、动态组件。 属性透传: 可以避免在中间层组件中重复定义这些属性或者方法 在子组件中不需要定义props和emits来接收属性和事件 依赖注入: 更加灵活在子组件,使用父组件提供的属性或方法,即使中间跨越了很多层级 与透传的区别在于,不需要中间层级的组件一级一级的透传属性 组件插槽: 用于插入父组件中的自定义DOM,分为默认插槽和具名插槽 具名插槽使用name="xxx"来定义标识符,父组件通过v-slot:xxx或#xxx将DOM插入指

积木成林,聚沙成塔 2965

前端开发:Vue组件事件属性穿透的使用

前言 在前端开发过程中,事件点击操作也是非常常用的,尤其是关于事件之间的属性穿透使用更是如此。在真实的业务场景中,会遇到点击事件冲突的情况,这就更涉及到事件的穿透相关的内容。在Vue中,关于组件事件属性穿透的知识点也是非常重要的,那么本篇博文就来分享总结一下事件穿透的知识点,方便查阅使用。 事件穿透场景 在实际开发过程中,会遇到一些场景:在页面里面弹出弹框,弹框上面有点击操作按钮,在弹框下面的页面中也有点击操作按钮,相同位置下,这样在点击弹框操作按钮的时候,也会重复触发弹框下面的点击操作按钮。

全沾软贱开发攻城狮 1万+

服务器被矿工入侵记录

一次服务器被矿工入驻的处理记录

王瑞的技术专栏 1333

Vue3 透传 Attributes

本文介绍了Vue3中Attributes透传的相关知识,主要包括:1.单个根文件继承时,外部class和事件会与子组件合并,内部事件先执行;2.深层组件会代代相传Attributes;3.通过defineOptions可禁用继承,或使用v-bind="$attrs"指定非根节点继承;4.多根节点时需手动指定继承节点。文章通过代码示例演示了不同场景下的透传效果,并总结了相关规则。

qq_39055970的博客 927

NXP(imx8qxp)系列DDR校准以及android镜像烧录

文章目录一、 不得不吐槽以下nxp的这个代码镜像烧写的过程,做得太开源了,导致镜像根本烧录不进去,实属令人头痛。 一、

永不秃头的程序员的博客 5991

vue3透传Attributes

本文介绍了Vue.js中的透传机制,主要涉及class、style、id等属性的透传,以及事件监听器的透传。透传指的是父组件传递给子组件的属性或事件,子组件未显式声明为props或emits时,这些属性或事件会自动透传到子组件的根元素上。文章通过代码示例展示了父组件如何透传class属性到子组件,并说明了透传的合并规则:如果子组件根元素已有相同属性,父组件的属性会与其合并;若属性权重相同,父级属性会覆盖后代级属性。此外,文章还演示了事件透传的机制,父组件定义的事件会透传到子组件,若子组件已有相同事件,则会合

2301_76459194的博客 1031

LiteratureReading:[2022] Reformer: The Efficient Transformer

所属机构:加州大学伯克利分校(U.C. Berkeley)和谷歌研究(Google Research)。电子邮件:kitaev@cs.berkeley.edu所属机构:谷歌研究(Google Research)。电子邮件:lukaszkaiser@google.com所属机构:谷歌研究(Google Research)。电子邮件:levskaya@google.com大型Transformer模型在许多任务上通常能够达到最先进的结果,但训练这些模型可能非常昂贵,尤其是在处理长序列时。

有朋自远方来,不亦乐乎。 1226

【原创理论】Stochastic Coupled Dyadic System (SCDS):一个用于两性关系动力学建模的随机耦合系统框架

基于二人爱情耦合系统动力学、稳定性与最优策略的综合性理论的数值模拟与分析

weixin_44695861的博客 1134

vue3 透传 Attributes 深度解析

透传attribute”指的是传递给一个组件,没有包含在该组件的props或emits中的attribute或者v-on事件监听器-- 父组件 --> < script setup > import {-- 父组件 --> < script setup > import {import-- 父组件 --> < script setup > import {-- 父组件 --> < script setup > import {

weixin_63155187的博客 1044

Twincat Scopeview录波中的Ringbuffer设置技巧与常见问题解决

本文深入解析了倍福Twincat Scopeview录波功能中Ringbuffer(环形缓冲区)的核心设置技巧与常见问题解决方案。针对数据丢失、触发时机不准等痛点,详细阐述了缓冲区大小、预触发样本、采样率等关键参数的优化配置,并提供了多通道同步、自动诊断等实战应用指南,帮助工程师高效捕捉和分析PLC数据。

rainy的博客 846

Vue 3 透传 Attributes 机制详解

透传 Attributes 是 Vue 组件间属性传递的重要机制,主要应用于:1.自动继承父组件的 HTML 属性:如 class、style 等样式相关属性2.传递自定义属性或事件监听器:无需子组件显式声明即可传递3.简化组件间通信:减少不必要的 props 声明,提高开发效率通过合理使用 $attrs 或 useAttrs(),开发者可以灵活控制透传行为,特别是在多根节点组件中实现精确的属性绑定。

m0_46091798的博客 839

SAP 系统间信任关系配置全攻略:从 SM59 到 SMT1 的实践与风险控制

本文介绍了在SAP系统间配置信任关系的详细流程与最佳实践。文章以SAP Gateway与后端系统架构为场景,从SM59创建RFC目的地开始,到SMT1建立信任关系,再到授权对象S_RFCACL的配置,提供了完整的操作指南。重点包括:使用标准命名规范创建专用RFC连接、通过向导完成系统间信任登记、严格控制S_RFCACL授权范围等。文中还分享了真实项目案例、可复用的检查清单以及常见问题的排查思路,帮助用户实现稳定可靠的跨系统无密码调用,同时确保安全性。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 324

【ARM CoreLink 系列 5.3 -- CI-700 SLC memory 系统组件详细介绍】

在 CI-700 系统级缓存(SLC)内存系统中,HN-F 节点负责管理缓存一致性和数据传输。每个 HN-F 节点可以发送三种类型的 Snoop 请求,以确保系统中多核处理器和缓存之间的一致性。CI-700 中的系统级缓存(SLC)内存系统通过 HN-F 节点支持 TrustZone® 技术。以下是 CI-700 支持的 SN 类型以及配置方法的简要介绍。ARM CI-700 系统级缓存(SLC)是一个分布式、主要排他性(mostly exclusive) 的最后一级缓存,集成在 HN-F 节点内。

CodingCos的博客 898

vue3.x 24 ! 透传 Attributes

透传 Attributes

monian187的博客 1079

uniapp+google map不显示

uniapp+renderJS+google map开发安卓版APP非小程序,google map小叉号不显示,google map自定义marker右上角的小叉号如何去掉,uniapp+google map不显示

renkai721的专栏 527

Vue3中的透传Attributes / $attrs:简化组件开发的利器

Vue3推出了一系列新功能和改进。使用下来后,其中一个很实用的新特性就是透传 Attributes(透传属性)。本文将介绍 Vue3中的透传 Attributes,并提结合代码示例来展示它在实际项目中的使用。

有事儿私信。 5962

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

《Vue3实战教程》20:Vue3透传 Attributes

现在我们要再次使用一下中的组件例子。有时候我们可能为了样式,需要在元素外包装一层template我们想要所有像class和v-on监听器这样的透传 attribute 都应用在内部的上而不是外层的上。我们可以通过设定和使用来实现:template会将一个对象的所有属性都作为 attribute 应用到目标元素上。

大强博客 410

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Vue3 透传 Attributes 助你玩转组件参数传递

需要注意的是,虽然这里的 attrs 对象总是反映为最新的透传 attribute,但它并不是响应式的 (考虑到性能因素)。和 props 有所不同,透传 attributes 在 JavaScript 中保留了它们原始的大小写,所以像 foo-bar 这样的一个 attribute 需要通过 $attrs['foo-bar'] 来访问。“透传 attribute”指的是传递给一个组件,却没有被该组件声明为 props 或 emits 的 attribute 或者 v-on 事件监听器。

newlearner的博客 983

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

4.Vue3的Attributes透传

Attributes透传的使用

button_x的博客 500

前端流行框架Vue3教程:18. 透传 Attributes

透传attribute指的是传递给一个组件,却没有被该组件声明为props或emits的attribute或者v-on事件监听器。最常见的例子就是class、style和id当一个组件以单个元素为根作渲染时,透传的attribute会自动被添加到根元素上透传 Attributes 是 Vue 的一个特性,允许父组件传递任意属性到子组件上,而无需显式声明。这在封装可复用的组件时非常有用。

程序员涛哥的博客 564

Vue3透传Attributes

Vue3透传Attributes

性感码农在线写笔记 811
上一篇: vue3 内置组件 <Suspense>
下一篇: vue3 组合式API defineEmits() 与 emits 组件选项
fishmemory7sec
博客等级 码龄5年 1165粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值