vue组件传值之$attrs

news2024/11/28 10:59:56

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之中,同样,刚才已经提到过,如果子组件接收了父组件的数据,那么在孙组件就会看不到数据,正是这个原因

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从0开始深度学习(14)——模型选择、欠拟合、过拟合

① 模型在训练数据上拟合的比在潜在分布中更接近的现象&#xff0c;就叫过拟合&#xff08;overfitting&#xff09; ② 用于对抗过拟合的技术称为正则化&#xff08;regularization&#xff09; 1 训练误差和泛化误差 ①训练误差&#xff08;training error&#xff09;&…

scrapy 爬虫学习之【中医药材】爬虫

本项目纯学习使用。 1 scrapy 代码 爬取逻辑非常简单&#xff0c;根据url来处理翻页&#xff0c;然后获取到详情页面的链接&#xff0c;再去爬取详情页面的内容即可&#xff0c;最终数据落地到excel中。 经测试&#xff0c;总计获取 11299条中医药材数据。 import pandas as…

CTFHUB技能树之HTTP协议——响应包源代码

开启靶场&#xff0c;打开链接&#xff1a; 是个贪吃蛇小游戏&#xff0c;看不出来有什么特别的地方 用burp抓包看看情况&#xff1a; 嗯&#xff1f;点击“开始”没有抓取到报文&#xff0c;先看看网页源代码是什么情况 居然直接给出flag了&#xff0c;不知道这题的意义何在 …

某MDM主数据管理系统与微软Dynamic CRM系统(国内节点)集成案例

一、需求分析 需要完成的核心场景&#xff1a; 客户主数据&#xff1a;通过SAP PO集成中间件平台&#xff0c;某MDM主数据实时推送客户主数据信息至微软CRM系统&#xff0c;方便微软CRM系统进行客户方面的管理&#xff0c;并供微软CRM查询员工信息&#xff0c;修改员工&…

IDEA运行Java程序时出错。提示:命令行过长。通过 JAR 清单或通过类路径文件缩短命令行,然后重新运行。

文章目录 一、遇到问题二、分析问题三、解决办法 一、遇到问题 运行 OpenCVUtils.test 时出错。命令行过长。 通过 JAR 清单或通过类路径文件缩短命令行&#xff0c;然后重新运行。二、分析问题 IDEA提示很明显了。 三、解决办法 运行——>编辑配置 运行/调试配置——&g…

024_Symbolic_Math_in_Matlab符号数学工具箱的使用思路

符号运算与数值计算 缘&#xff0c;妙不可言 给本科、硕士、博士、研究实习员、助理研究员、副研究员改过Matlab代码&#xff0c;最有意思也最好玩的就是兄弟姐妹们喜欢把符号运算跟数值计算混合在一起。 从概念上看&#xff0c;还是挺不错的。 大佬们的计划都是这样的&…

64页精品PPT | 汽车经销商数据应用解决方案

汽车经销商正面临前所未有的盈利能力挑战。从18年起 &#xff0c;传统燃油车汽车行业开始步入低速增长阶段 &#xff0c;卖车已经挣不到钱 &#xff0c;利润往往来自任务完成的厂家返利&#xff1b;新兴的直营模式的出现 &#xff0c;冲击了传统授权经销的方式 &#xff0c;疫情…

车辆管理新篇章:SpringBoot技术解析

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

sns数据分析

探索性数据分析 这一部分目的在于了解数据&#xff0c;包括数据是什么类型&#xff0c;数据有什么特点 数据信息 print(data.shape) data.info()(1086, 12) <class pandas.core.frame.DataFrame> Index: 1086 entries, 2020/7/1 0:00 to nan Data columns (total 12 c…

鸿蒙网络编程系列24-Web组件与应用互操作示例

1. APP内嵌网页与应用互操作概述 在通常的APP开发中&#xff0c;经常会采用内嵌网页的形式&#xff0c;通过网页来展现丰富的动态内容&#xff0c;虽少了很多原生开发的功能&#xff0c;但是这么做无可厚非&#xff0c;毕竟APP需要适配的系统平台很多&#xff0c;比如安卓、苹…

leetcode289:生命游戏

根据 百度百科 &#xff0c; 生命游戏 &#xff0c;简称为 生命 &#xff0c;是英国数学家约翰何顿康威在 1970 年发明的细胞自动机。 给定一个包含 m n 个格子的面板&#xff0c;每一个格子都可以看成是一个细胞。每个细胞都具有一个初始状态&#xff1a; 1 即为 活细胞 &am…

babylonjs shader学习之copy shadertoy案例

shadertoy案例&#xff1a; 准备 const onSceneReady (scene: Scene) > {const light new HemisphericLight(light, new Vector3(0, 1, 0), scene);light.intensity 0.7;Effect.ShadersStore[planeMatVertexShader] precision highp float;attribute vec3 position;attr…

SpringMVC一个拦截器和文件上传下载的完整程序代码示例以及IDEA2024部署报错 找不到此 Web 模块的 out\artifacts\..问题

一、SpringMVC一个拦截器和文件上传下载的完整程序代码示例 本文章是一个 SpringMVC拦 截器和文件上传下载的完整程序代码示例&#xff0c;使用的开发工具是 IntelliJ IDEA 2024.1.6 (Ultimate Edition)&#xff0c; 开发环境是 OpenJDK-21 java version 21.0.2。Tomcatt版本为…

Flux.concat 使用说明书

public static <T> Flux<T> concat(Iterable<? extends Publisher<? extends T>> sources)Concatenate all sources provided in an Iterable, forwarding elements emitted by the sources downstream. 连接可迭代集合中提供的所有源&#xff0c;将…

【web】JDBC

项目连接数据库 右侧导航栏找到databsae 如果没有驱动&#xff0c;先下载驱动 填写数据库用户名密码 勾选对应的表即可 JDBC代码流程 1,配置信息 2,加载驱动 从MySQL Connector/J 5.1版本开始&#xff0c;推荐使用com.mysql.cj.jdbc.Driver这个新的驱动类。 3,链接数据库…

【MR开发】在Pico设备上接入MRTK3(三)——在Unity中运行MRTK示例

在前面的文档中&#xff0c;介绍了如何在Unity工程中配置号MRTK和Pico SDK 【MR开发】在Pico设备上接入MRTK3&#xff08;一&#xff09;在Unity中导入MRTK3依赖【MR开发】在Pico设备上接入MRTK3&#xff08;二&#xff09;在Unity中配置Pico SDK 本文将介绍如何运行一个简单…

SQL进阶技巧:如何找出开会时间有重叠的会议室?| 时间区间重叠问题

目录 0 场景描述 1 数据准备 2 问题分析 方法1:利用 lateral view posexplode()函数将表展开成时间明细表 方法2:利用数学区间讨论思想求解 3 小结 0 场景描述 有7个会议室,每个会议室每天都有人开会,某一天的开会时间如下: 查询出开会时间有重叠的是哪几个会议室?…

Agentic RAG(基于智能体的检索增强生成)是检索增强生成(Retrieval-Augmented Generation,RAG)技术的一种高级形式

Agentic RAG&#xff08;基于智能体的检索增强生成&#xff09;是检索增强生成&#xff08;Retrieval-Augmented Generation&#xff0c;RAG&#xff09;技术的一种高级形式&#xff0c;它通过引入人工智能代理&#xff08;Agent&#xff09;的概念&#xff0c;为语言模型赋予了…

C#从零开始学习(用unity探索C#)(unity Lab1)

初次使用Unity 本章所有的代码都放在 https://github.com/hikinazimi/head-first-Csharp Unity的下载与安装 从 unity官网下载Unity Hub Unity的使用 安装后,注册账号,下载unity版本,然后创建3d项目 设置窗口界面布局 3D对象的创建 点击对象,然后点击Move Guzmo,就可以拖动…

018_FEA_Structure_Static_in_Matlab三维结构静力学分析

刹车变形分析 本示例展示了如何使用 MATLAB 软件进行刹车变形分析。 这个例子是Matlab官方PDE工具箱的第一个例子&#xff0c;所需要的数据文件都由Matlab提供&#xff0c;包括CAD模型文件。 步骤 1: 导入 CAD 模型 导入 CAD 模型&#xff0c;这里使用的是一个带有孔的支架模…