vue组件传值之$attrs

Vue中组件通信-$attrs与$listeners listeners与$attrs(组件通信方式的一种)他们两者都是组件实例的属性,可以获取到父组件给子组件传递的props与自定义事件。 阅读详情
AI摘要

本文介绍了Vue.js中$attrs的使用,它可实现父组件向子组件的子组件(祖孙)通信。$attrs是包含父组件传入标签属性的对象,会排除props中声明的属性。文中通过创建父 - 子 - 孙组件关系示例,展示了传值过程,还提及孙组件修改爷爷数据的方法及相关注意点。

1.概述:$attrs用于实现当前组件的父组件,向当前组件的子组件通信(祖-》孙)

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

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

首先,创建父-子-孙之间的组件关系

我们首先来看父子之间的传值:
我们都知道,父传子传值的口诀是:父在子的属性上书写属性名=属性值,子组件使用defineProps接收。

那么我们的父组件的代码如下:【组件关系:爷爷:index.vue,子:brother.vue,孙:grandSon.vue】

index.vue

<template>  
    <div>  
      <el-card ref="myButton"  @click="handlerClick">Click Me
        <el-card @click="clickSpan">点我</el-card>
        <Children ref="childRef" :fatherToSon="handlerClick"></Children>
        <!-- @myHandler="handlerClick" -->
         <Brother v-model:aaa="name" age="20" :happy="happy" :happyPlus="happyPLus" test="测试数据" v-bind="{x:100,y:200}" />
         <!-- <el-tag type="danger" size="normal"  effect="dark" closable @close="">{{ name }}</el-tag -->
         <el-badge :value="name" :max="99" :is-dot="false" :hidden="false" type="primary">
          
          <el-button size="small">cet</el-button>
         </el-badge>
         <br />
         
         
         爷爷的:{{ happy }}
      </el-card>  
    </div>  
  </template>  
    
  <script lang="ts" setup>  
  import { ref, onMounted, nextTick } from 'vue';  
  import { ElButton } from 'element-plus'; // 确保你已经正确引入了 Element Plus  
  import Children from './child.vue'  
  import Brother from './brother.vue'
  const childRef = ref(null);  
  const name = ref('tomCat')
let happy=ref('哈哈')
const happyPLus=()=>{
    happy.value+='!'
}
      const myButton = ref(null);  
      
      const handlerClick=(value:any)=>{
        console.log("父组件被点击了,子组件传递过来的值为",value);
        console.log(childRef.value);
        console.log(childRef.value?.SonFun());
        console.log(childRef.value?.sonValue);
        
        
        
        
      }
      const clickSpan=()=>{
        console.log("span被点击了");
      }
      // onMounted(() => {  
      //   // 访问 el-button 组件实例  
      //   console.log(myButton.value);  
      //   console.log(24,myButton.value.handleClick);
      //   console.log(25,ref);
        
      //   // 打印所有属性和方法(注意:直接操作实例的属性和方法可能不是最佳实践)  
      //   console.log('Properties:', Object.keys(myButton.value.$props));  
      //   console.log('Methods:', Object.keys(myButton.value.$options.methods));  
      // });  
    
      // 返回 ref 以便在模板中使用  
      
    
   
  </script>

可以看到父给子传递的数据,有静态的,也有动态的,也有使用v-bind=对象的这种方式来传递的,其实这种方式就是等价于:

v-bind="{x:100,y:200}"   ==》 :x=100 :y=200

 

这样我们就可以看到对应的x和y也被传递过来了,然后我们的关注重点是祖孙传值,而不是父子传值,所以这个brother组件就是一个桥梁,其作用就是不使用父组件的值,直接将父组件传递的值使用$attrs直接传递给孙组件。

brother.vue

<template>
 <div>
  自定义组件实现v-model
    <!-- <input type="text" :value="aaa" @input="inputChange"/>
    <h3>age:{{ age }}</h3>
    <h3>其他:{{ $attrs }}</h3> -->
    <GrandSon v-bind="$attrs"></GrandSon>
 </div>
</template>

<script setup lang="ts">
import {ref,reactive} from 'vue'
import GrandSon from './grandSon.vue';
// const emit =defineEmits(['update:aaa'])

// defineProps(['aaa','age'])

// const inputChange=({target:{value}})=>{
//     emit('update:aaa',value)

// }
</script>

<style scoped>

</style>

这里我们需要注意的时,当父组件传递给孙组件的值被子组件接收后,如果子组件没有传递出去,那么孙组件就无法使用被子组件占用的值。

孙组件grandSon.vue

<template>
 <div>
  this is grandson page
<h2>test:{{ test }}</h2>
<h2>age:{{ age }}</h2>
<h2>x:{{ x }}</h2>
<h2>y:{{ y }}</h2>
<h2>孙子的happy:{{ happy }}</h2>

<el-button type="primary" size="default" @click="happyPlus">修改爷爷的happy</el-button>

 </div>
</template>

<script setup lang="ts">
import {ref,reactive} from 'vue'
defineProps(['test','age','x','y','happy','happyPlus'])


</script>

<style scoped>

</style>

来到调试工具,我们就可以看到孙组件接受到了来自爷爷传递过来的值。

然后我们可能会有疑问,既然爷爷可以向孙组件传递数据,那么孙可不可以修改爷爷的数据呢,其实,原理和当时的props是一样的,这种方式虽然不能直接修改爷爷的值,但是可以让爷爷再传递一个方法给孙组件,然后孙组件调用这个方法,完成对爷爷的修改。比如传递过来的函数happyPLus

 

 

 

来到界面,我们点击按钮,就可以修改爷爷的数据

 

有几个比较细致的点,需要注意一下,就是当父组件给子组件传递数据的时候,子组件可以不全部接受父组件传递过来的数据, 

 

可以看到,接受到的数据被放在props中,没接受的数据放到了attrs之中,同样,刚才已经提到过,如果子组件接收了父组件的数据,那么在孙组件就会看不到数据,正是这个原因

 

vue中使用v-bind=“$attrs“进行多层组件的传值 有如下的嵌套关系 <grandfather> <father> <grandson> </grandson> </father> </grandfather> 比如说在grandfather中传给了father一些props grandfather.vue <div> <father name="test" age="18" hobby="badminiton" grade="3" . 阅读详情

相关推荐

$attrs

$attrs 是什么? $attrs是Vue实例的属性。 官网介绍 个人理解: 所谓的$arrts其实就是多级组件中的props,它就像一个中间件,用来传递爷组件给孙组件的数据,使用的时候只需给父组件中的孙组件配置 v-bind="$attrs" ,然后再爷组件中传入孙组件所需要的数据,孙组件正常接收即可。 ...

郭宝的博客 6119

Vue中 $attrs、$listeners 详解及使用

1. 前言 多级组件嵌套需要传递数据时,通常使用的方法是通过 vuex。如果仅仅是传递数据,而不做中间处理,使用 vuex 处理,未免有点杀鸡用牛刀。 Vue 2.4 版本提供了另一种方法,使用 v-bind=”$attrs”, 将父组件中不被认为 props 特性绑定的属性传入子组件中,通常配合 interitAttrs 选项一起使用。之所以要提到这两个属性,是因为两者的出现使得组件之间跨组件的通信在不依赖 vuex 和 事件总线 的情况下变得简洁,业务清晰。 首先分析以下应用场景 A 组件与 B 组件

明天也要努力的博客 4万+

Vue - $attrs 的多种用法

中一个非常有用的属性,它可以方便地传递父组件中未被子组件识别的属性。通过传递所有属性、过滤不需要的属性以及传递事件处理函数,我们可以灵活地在组件之间传递数据并实现更强大的组件通信。$attrs属性最常见的用法是将父组件中的所有属性传递给子组件。这在开发过程中非常实用,因为它允许我们将父组件的属性传递给子组件,而无需在子组件中显式声明这些属性。是一个非常有用的属性,用于传递父组件中未被子组件所识别的属性。它提供了一种方便的方式来在组件之间传递数据,使得组件的通信更加灵活和可扩展。在上面的示例中,父组件。

KwyxLibrary的博客 480

Vue组件通信-$attrs与$listeners概念与应用

一、$attrs与$listeners是什么$attrs与$listeners都是是属于组件实例自身的一个属性:包含了父作用域中不包含在props中的属性,这些属性可以在组件内部使用,也可以通过v-bind="$attrs"传递给子组件使用。:包含了父作用域中的(不含.sync修饰器的)v-on事件监听器,这些监听器可以在组件内部使用,也可以通过v-on="$listeners"传递给子组件使用。

weixin_71403100的博客 6782

避坑指南:用逐飞开源库驱动MT9V03X摄像头时容易忽略的3个细节(附TFT显示优化技巧)

本文详细解析了在智能汽车竞赛中使用MT9V03X摄像头(总钻风)时常见的硬件连接、图像采集和TFT显示优化问题。重点介绍了逐飞开源库中容易被忽略的三个关键细节,包括电源管理、看门狗设置和中断优先级配置,并提供了针对IPS200和TFT180显示屏的优化技巧,帮助参赛队伍提升图像处理效率和显示质量。

study的专栏 744

Ultrascale/Ultrascale+ FPGA GTH IP及结构详解(一)

FPGA GTH Transceiver

houzi6320的博客 1万+

vue 组件传值之 $attrs、$listeners

vue 组件传值之 attrs、attrs、attrs、listeners vue的通信方法常用的有,父传子 props, 子传父 通过绑定@事件,子组件$emit 传值,也可以父组件给子组件props传递一个函数,子组件调用函数,利用参数传值。 其他的还有vuex集中状态管理,eventBus也就是事件的全局$emit, $on 来抛发事件传值 以及接下来的attrs、attrs、attrs、...

天空之上有座城 1578

六维力传感器选型指南:电阻式vs电容式,哪个更适合你的工业场景?

本文深入解析六维力传感器在工业自动化中的选型要点,重点对比电阻式与电容式传感器的核心原理、环境适应性及成本结构。针对不同工业场景(如高精度装配、重载机器人等),提供专业选型建议,帮助工程师优化系统性能与经济效益。

weixin_42525005的博客 395

vue组件传值之$attrs、$listeners

组件传值总结 props和emit:父子组件传值 provide和inject:父子组件或者爷孙组件传值 $parent,$root,$chidren:父子组件传值 vuex 事件总线(vue实例) $attrs、$listeners:父子组件传值 前5种可能大部人都知道,这篇文章主要对$attrs、$listener进行一个介绍。 $attrs、$listeners $attrs: 官方文档介绍:包含了父作用域不作为prop被识别(且获取)的attribute绑定(class和style除外)。当一个

weixin_45805570的博客 2568

KDD 2025 | 人大团队提出多任务贝叶斯联邦学习算法,同时处理分类和回归

©PaperWeekly 原创 ·作者 |吕俊良单位 |中国人民大学统计学院本文介绍了中国人民大学统计学院的一篇关于多任务贝叶斯联邦学习的文章“Task Diversity in Bayesian Federated Learning: Simultaneous Processing of Classification and Regression”,本文被 KDD 2025 接收,代码已经...

Paper weekly 2746

STM32--基于STM32F103C8T6的OV7670摄像头显示

使用 STM32F103C8T6 微控制器驱动 OV7670 摄像头模组,并将图像数据显示在屏幕上,是嵌入式系统中常见的图像采集与显示应用。OV7670 是一款 CMOS VGA 图像传感器,具有高灵敏度、低电压等特点,适用于嵌入式应用。而 STM32F103C8T6 是一款常用的 MCU 控制器,具有丰富的管脚资源和较高的工作频率。

duierrorshuobu的博客 2145

vue3组件传值 $attrs

【代码】vue3组件传值 $attrs。

mhbsoft的博客 156

Python在Genesis2000 CAM软件中的编程应用

Genesis2000是一款功能强大的计算机辅助制造(CAM)软件,它提供了广泛的功能和工具,用于帮助制造商进行CAD(计算机辅助设计)到CAM的转换。在Genesis2000中,我们可以利用Python的灵活性和功能来扩展软件的自定义能力,并通过编写脚本来自动化各种制造任务。例如,假设我们需要在Genesis2000中添加一个新的操作,用于自动计算零部件的重量。我们可以编写一个Python脚本,通过遍历模型的几何数据并应用相关的计算公式,来实现这个功能。

PixelEnigma的博客 2423

vue 组件传值(一)$attrs,$listeners

vue 组件传值(一)$attrs,$listeners $attrs:包含了父作用域中不作为 prop 被识别 (且获取) 的特性绑定 (class 和 style 除外)。当一个组件没有声明任何 prop 时,这里会包含所有父作用域的绑定 (class 和 style 除外),并且可以通过 v-bind="$attrs" 传入内部组件——在创建高级别的组件时非常有用。 $listeners:包含了父作用域中的 (不含 .native 修饰器的) v-on 事件监听器。它可以通过 v-on="$liste

qq_40891322的博客 319

【AHE数据集】历史/未来全球网格热排放数据 PF-AHF

AHE数据集

WW、forever的博客 127

【ROS】ROS2导航Nav2:简介、安装、测试效果、错误处理

在ROS2中自动导航使用Nav2来实现。Nav2 使用几个独立的模块化服务,通过 ROS 2接口(例如动作服务器或服务)与行为树 (BT) 通信。Nav2 输入包括:TF转换、一个地图源、一个行为树 (BT) XML 文件和相关的传感器数据源;Nav2 输出速度命令;Nav2 支持多种机器人,比如:四足机器人、履带机器人、轮式机器人等。

郭老二 5082

vue组件之间传值的方式(inheritAttrs + $attrs + $listeners)

组件之间传递数据的方式可能有 父组件通过 props 的方式向子组件传值 子组件通过 $emit 传递的方法参数向父组件传值 使用 vuex 进行状态管理 兄弟组件之间可以使用 event bus 事件总线传值 非父子组件之间使用 inheritAttrs + $attrs + $listeners 传值(跨多级的组件嵌套关系) 这里主要讲最后一种方式传值 应用场景图大概是这样 三个组件,A组件与B组件是父子组件,A组件与C组件是跨多级的组件嵌套关系 代码示例: fatherA.vue <tem

风如也的博客 443

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

vue 组件传值方法2-使用$attrs实现组件传值

图中 第一行是最高级组件里的两条数据’App‘和‘组件传值’,‘组件传值’是用笨办法每一个组件中都用props定义个属性接受,很费劲,数据多了不小心就出错; ‘App’是用attrs来实现的,官网是这么描述的:包含了父作用域中不作为 prop 被识别 (且获取) 的特性绑定 (class 和 style 除外)。当一个组件没有声明任何 prop 时,这里会包含所有父作用域的绑定 (class 和 ...

宏斌的博客 4028

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Vue组件传值 之 $attrs 和 $listeners

首先,我们先来看一下官方对$attrs 和 $listeners的解释: $attrs:包含了父作用域中不作为 prop 被识别 (且获取) 的特性绑定 (class 和 style 除外)。当一个组件没有声明任何 prop 时,这里会包含所有父作用域的绑定 (class和 style 除外),并且可以通过 v-bind="$attrs" 传入内部组件——在创建高级别的组件时非常有用。 $list...

归小超博客 1002

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

vue组件深层传值inheritAttrs、$attrs、$listeners

1、$attrs 组件深层传值 可通过父组件绑定 v-bind="$attrs"传给子组件 一般子组件this.$attrs可以拿到父组件的所有传输的属性。 当子组件props注册了声明某属性之后,this.$attrs将不包含该属性; 同理通过v-bind="$attrs"绑定孙子组件也不会包含子组件props声明的属性。 props: { data:{ type: Array, default: () => [],//数组格式[{label:xx,valu...

qq_32615575的博客 1088

vue爷孙组件传值之$attrs

在vue组件传值中,父组件向子组件传值可以使用props进行传递,但是如果爷爷组件向孙子组件传递如何操作?这里使用的是$attrs 首先定义三个组件,app(爷爷组件),father(父组件),son(孙子组件) 我们要达到的目的是,爷爷组件向孙子组件传递一个数组list 然后在爷爷组件中 在父组件中使用v-bind 最后在孙子组件中接收数据 这样就完成了祖孙组件的传值 ...

weixin_45393280的博客 1689

vue组件深层次传值方式-$attrs/$listeners

attrs与attrs与attrs与listeners的主要应用是实现多层嵌套传递。 组件A与组件B通信一般都会使用组件B中转,即A传递给B,B再给C,但是如果A到C组件之间嵌套的组件过多,需要传递的事件和属性较多,会导致代码繁琐,代码维护困难。在vue2.4中,为了解决该需求,引入了attrs和attrs和attrs和listeners,新增了inheritAttrs选项。 $attrs的使用 官方定义: 包含了父作用域中不作为prop 被识别 (且获取) 的特性绑定 (class和 style除外)。

xieyuleisss的博客 966

Vue组件传值(三)之 深层嵌套组件传值 - $attrs 和 $listeners

$attrs     包含了父作用域中不作为 prop 被识别 (且获取) 的特性绑定 (class和style除外)。当一个组件没有声明任何 prop 时,这里会包含所有父作用域的绑定 (class和style除外),并且可以通过v-bind="$attrs"传入内部组件——在创建高级别的组件时非常有用。 $listener     包含了父作用域中的 (不含.native...

weixin_34234721的博客 1490

vue组件传值$attrs和$listerers

vue组件传值。三方组件代码封装

weixin_43850458的博客 400
上一篇: 前端学习笔记(1.0)
下一篇: 前端学习笔记(2.0)
mez_Blog
mez_Blog 新星创作者: 前端开发技术领域 新星创作者: 前端开发技术领域
博客等级 码龄9年 1万+粉丝 346原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mez_Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值