全网最通俗易懂的vue透传

news2025/1/19 10:30:16

概念:

Vue的透传是指在Vue组件中,使用特定的语法将父组件传递的属性或事件直接传递给子组件,实现了通过父组件传递数据或事件,再传递给子组件的功能。(传递给一个组件,却没有被该组件声明为 props 或 emits 的 attribute 或者 v-on 事件监听器。最常见的例子就是 class、style 和 id。)

在vue2中,透传可以通过v-bind="$attrs"和v-on="$listeners"指令来实现。v-bind指令可以将父组件的属性直接绑定到子组件上,而v-on指令可以将父组件的事件直接绑定到子组件上。

而vue3中,将v-bind和v-on进行了合并,我们只需要v-bind="$attrs"这一个指令就能把父组件的属性和方法都绑定到子组件上。

作用:透传能给我们组件复用或者二次封装第三方库带来极大的便捷。

下面让我们来看看vue3和vue2的透传的实际用法吧:

Vue3:

如何使用透传

父组件:直接传属性和方法

<template>
  <div>
    <ChildComponent name="John Doe" age="25" @handleData="handleData"/>
  </div>
</template>
 
<script setup>
import ChildComponent from './ChildComponent.vue';

const handleData = () => {
   // ...逻辑
}
</script>

子组件:使用 $attrs 或 useAttrs() 接收属性和方法

<template>
  <div>
    <!-- 在模板的表达式中直接用 $attrs 访问到 -->
    <p>{{ $attrs.name }}</p>
    <!-- 也可以用 useAttrs() 访问到 -->
    <p>{{ attrs.age }}</p>
    <button @click="$attrs.handleData">按钮1</button>
    <button @click="onChange">按钮2</button>
  </div>
</template>
 
<script setup>
  // 在js里 使用 useAttrs() API 来访问到
  import { useAttrs } from 'vue'
 
  const attrs = useAttrs()
  console.log(attrs)
  const onChange = () => {
      attrs.handleData()
  }
</script>

透传注意点

当一个组件以单个元素为根作渲染时,透传的 attribute 会自动被添加到根元素上。多个根节点的组件没有自动 attribute 透传行为。如果 $attrs 没有被显式绑定,或者没有被使用,将会抛出一个运行时警告。

把上面的子组件改一下,多一个div根节点:

下面是被透传的子组件

<template>
  <div>
    <h2>{{ name }}</h2>
  </div>
  // 多了一个根节点(Vue3是支持多个根节点的)
  <div></div>
</template>
 
<script setup>
  defineProps({
    name: String
  })
</script>

此时报错表示:vue不知道要将 attribute 透传到哪里。

解决办法:如果 $attrs 被显式绑定 或者 使用,或者 两者同时出现,则不会有警告。

下面是解决后的代码:

<template>
  <!-- 显示绑定 -->
  <div v-bind="$attrs">
    <h2>{{ name }}</h2>
  </div>
  <div>
    <!-- 使用 -->
    <p>{{ $attrs.age }}</p>
  </div>
</template>
 
<script setup>
  defineProps({
    name: String
  })
</script>

$attrs和显示绑定都能访问到属性和方法,但是它们的有些使用场景还是略有不同的,下面举个简单的栗子

修改一下父组件,添加一个id属性,子组件不变:

<template>
  <div>
    <ChildComponent id="custom-layout" name="John Doe" :age="25" />
  </div>
</template>
 
<script setup>
  import ChildComponent from './ChildComponent.vue'
</script>

这里可以看到的是,父组件传递下来的id属性,自动添加到了使用 v-bind 显示绑定的元素上了。而没有显示绑定的元素,是不会获得透传过来的id的

关闭透传

我们在使用vue2的透传的时候,可以设置inheritAttrs这个属性为false,来禁用透传,那么在Vue3中我们如何禁用透传呢?

其实从 3.3 开始我们就可以直接在 <script setup> 中使用 defineOptions来禁用透传。

我们需要明白,禁用透传只是禁用了自动透传,我们仍然可以通过显式$attrs访问到透传的属性和方法

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

Vue2

vue2版本里,透传的属性可以使用this.$attrs获取到。在父级给组件绑定的事件可以用this.$listeners获取到。但是在vue3版本中,父组件透传来的属性都放在了$attrs里面,使用useAttrs()可以获取所有透传的属性和方法。

如何使用透传

$attrs:包含父作用域里除 class 和 style 除外的非 props 属性集合。通过 this.$attrs 获取父作用域中所有符合条件的属性集合,然后还要继续传给子组件内部的其他组件,就可以通过 v-bind="$attrs"

$listeners:包含父作用域里 .native 除外的监听事件集合。如果还要继续传给子组件内部的其他组件,就可以通过 v-on="$linteners"

// Parent.vue
<template>
    <Child :name="name" age="28" @output='handlePrint'></Child>
</template
import Child from './child.vue'
export default{
    data(){
        return {
            name:"独求求败"
        }
    },
    components:{
        Child,
    },
    methods:{
        handlePrint(){
            console.log('name',this.name)
        }
    }
}
// Child.vue
<template>
    // 继续传给孙子组件
    <sun-child v-bind="$attrs" @bind="$linteners"></sun-child>
</template>
import SunChild from './SunChild.vue'
export default{
    components:{
        SunChild,
    },
    mounted(){
        console.log(this.$attrs)
        //{ name:"独求求败", age:28 }
    },
}
// sun-child.vue
<template>
    // 孙子组件
    <button @click="onClick">打印</button>
    //<button @click="$linteners.output">打印</button>  也可以直接调用父组件方法
</template>
export default{
    methods:{
        onClick(){
            this.$listeners.output()
        }
    }
}

vue2关闭透传

为了关闭透传,你可以在子组件中设置inheritAttrs:false

 <script>
 export default {
   inheritAttrs: false, // 禁用
    data(){
        return { ... }
    },
    methods:{ ... }
 };
 </script>

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

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

相关文章

2024年前一季度,国内医疗器械营收TOP10出炉!

随着国内医疗器械市场的不断发展&#xff0c;各大医疗器械公司的财报数据成为了投资者和行业观察者关注的焦点。近日&#xff0c;根据2024年第一季度财报数据&#xff0c;我们梳理出了中国医疗器械第一财季营收排名前十的械企&#xff0c;为大家带来深入的分析和解读。 一、营…

算法课程笔记——路径相关树形DP

算法课程笔记——路径相关树形DP #include<bits/stdc.h>usingnamespacestd; usingLL longlong; constintN 2005; vector<int>e[N],t; structasdf{vector<int> vec; LL val; }; vector<asdf>w[N]; LL dp[N]; intn,m,k,dep[N]{1},f[N]; voiddfs(in…

图生视频,Stable Diffusion WebUI Forge内置SVD了!

在 Stable Diffusion WebUI Forge 版本中内置了一个SVD插件&#xff0c;也就是 Stable Video Diffusion&#xff08;稳定视频扩散&#xff09;&#xff0c;之前我介绍过这个工具的使用方法&#xff1a;图片生成视频&#xff08;独立部署SVD) 但是当时还不能集成到Stable Diffu…

【代码阅读】SalsaNext

最近在找轻量级的语义分割模型&#xff0c;SalsaNext作为一个很经典的语义分割网络&#xff0c;在服务器的2080上面能够达到30毫秒一帧左右的推理速度&#xff0c;但是其网络本身提出的时间比较久远&#xff0c;后处理的部分使用的依然是最经典的knn&#xff0c;fidnet的后处理…

【已解决】attributeerror: ‘FreeTypeFont‘ object has no attribute ‘getsize‘

&#x1f60e; 作者介绍&#xff1a;我是程序员行者孙&#xff0c;一个热爱分享技术的制能工人。计算机本硕&#xff0c;人工制能研究生。公众号&#xff1a;AI Sun&#xff0c;视频号&#xff1a;AI-行者Sun &#x1f388; 本文专栏&#xff1a;本文收录于《AI实战中的各种bug…

Spring Cloud 概述及项目创建

本篇主要介绍什么是Spring Cloud&#xff0c;以及Spring Cloud工程的创建 目录 一、什么是微服务&#xff1f; 集群 分布式 微服务 二、Spring Cloud 什么是Spring Cloud Spring Cloud 版本 Spring Cloud实现方案 Spring Cloud 工程创建 创建父工程 创建子工程 一、…

对文本框做字数限制

效果图 实现步骤 其中绝对布局根据需求自行调整 <!--单文本输入框--> <div class"form-group"><label class"col-sm-2 control-label is-required">面试公司&#xff1a;</label><div class"col-sm-9"><input …

【原创】springboot+mysql校园宿舍报修管理系统设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…

日志:打印技巧

一、概览 Unity日志打印技巧 常规日志打印彩色日志日志存储与上传日志开关日志双击溯源 二、常规日志打印 1、打印Hello World 调用堆栈可以很好的帮助我们定位问题&#xff0c;特别是报错的Error日志 Debug.Log("Hello World");Debug.Log("This is a log m…

【Linux】线程机制解析:理解、优势与Linux系统应用

文章目录 前言&#xff1a;1. 线程概念1.1. 什么是线程1.2. 线程得优点&#xff1a;1.3. 线程的缺点线程异常线程的用途 2. 线程的理解&#xff08;Linux 系统为例&#xff09;2.1. 为什么要设计Linux“线程"&#xff1f;2.2. 什么是进程&#xff1f;2.3. 关于调度的问题2…

图像归一化处理

归一化 归一化是一种简化计算的方式&#xff0c;即将有量纲的表达式&#xff0c;经过变换&#xff0c;化为无量纲的表达式&#xff0c;成为标量。 在多种计算中都经常用到这种方法。 简单介绍 归一化是一种无量纲处理手段&#xff0c;使物理系统数值的绝对值变成某种相对值关…

IDEA报错:java 找不到符号

IDEA报错:java 找不到符号,代码没问题,IDEA缓存也清理了也重新构建了就是不行 最后使用终极大法 -Djps.track.ap.dependenciesfalse

Eclipse 里如何建立SAP应用服务层的CDS

关于Core Data Service(CDS) CDS:Core Data Ser vice.核心数据服务。CDS 是使用基于 SQL的数据定义语言(DDL)定义的&#xff0c;该语言基于标准 SQL 并带有一些附加概念。使用类似 SQL的灵活表达式可以进行复杂的数据建模。有两种类型的 CDS:ABAP CDS 和 HANA CDS。 S/4 HANA…

Unity Pixels Per Unit 与 Sprite Renderer Scale的逻辑关系,为什么平铺的Sprite Renderer会变形?

SpriteRenderer之前用的比较基础&#xff0c;没遇到过什么问题&#xff0c;这几天使用SpriteRenderer的平铺时发现平铺变形了&#xff0c;研究了一下&#xff0c;原来有这么多在逻辑在里面。 当我们导入图片选择Texture Type为Sprite时表示我们的图片用途是UI或者SpriteRendere…

【刷题(2)】矩阵

一、矩阵问题基础 遍历&#xff1a; for i in range(len(matrix[0])): for j in range(len(matrix): while 倒序遍历&#xff1a; for i in range(right,left,-1) 临时存储&#xff1a;temp w,h:len(matrix[0])-1 len(matrix)-1 left,right,top,bottom:0 len(matrix[0])-1 0 l…

NMACDR:基于邻居交互增强和多头注意力机制的跨域推荐模型

基于邻居交互增强和多头注意力机制的跨域推荐模型 湖北民族大学学报-孙克雷、汪盈盈-2023 思路 针对基于映射的跨域推荐模型没有充分关注源域中数据稀疏的用户,导致用户偏好的迁移效率降低的问题,提出本文。 首先,利用邻居用户的交互来增强源域中数据稀疏用户的交互序列,…

热搜榜小工具,摸鱼必备NO.99

本文一共:188 个字,需要阅读:1 分钟,更新时间:2024年5 月14日,部分内容具有时效性,如有失效请留言,阅读量:0 这个小工具集成了微博热搜、百度热搜、今日头条热搜、抖音热搜&#xff0c;随意切换 右上角有个设置&#xff0c;可以设置自动刷新时间、监控关键词、透明度、靠边隐藏…

鸿蒙内核源码分析 (编码方式篇) | 机器指令是如何编码的?

本篇说清楚 ARM指令是如何被编码的&#xff0c;机器指令由哪些部分构成&#xff0c;指令有哪些类型&#xff0c;每种类型的语法又是怎样的 ? 代码案例 | C -> 汇编 -> 机器指令 看一段C语言编译(clang)成的最后的机器指令(armv7) int main(){int a 0;if( a ! 1) a …

dataframe数据常用python操作

dataframe数据常用python操作 dataframe数据常用知识点1.创建dataframe1.1使用字典创建DataFrame&#xff1a;1.2使用列表创建DataFrame&#xff1a;1.3使用numpy数组创建DataFrame&#xff1a;1.4从TXT文件中创建DataFrame&#xff1a;1.5从CSV文件中创建DataFrame&#xff1a…

卡巴斯基:2024年Q1漏洞和利用报告

近日&#xff0c;卡巴斯基发布了《2024年Q1漏洞和利用报告》&#xff0c;提供了一系列有洞察力的统计和分析快照&#xff0c;揭示了新漏洞和利用的发展趋势&#xff0c;以及攻击者最常利用的漏洞概述。为组织获悉和应对相关威胁提供了有价值的见解。 已注册漏洞统计数据 为了…