vue3中的透传attributes教程示例详解

目录
  • 引言
  • 绑定样式
    • 对象
    • 数组
  • 透传的attributes
    • 透传 attributes 之样式绑定
    • 透传 attributes 之事件绑定
    • 特殊1:组件嵌套
    • 特殊2:禁用透传attributes
    • 特殊3:在 javascript 中访问透传的attributes
  • 总结

引言

最近两年都是在使用 react 进行项目开发,看技术博客都是针对 react 和 javaScript 高级方面的,对 vue 的知识基本上遗忘的差不多了。最近开始慢慢回顾 vue 的知识以及对新的语法进行学习,为后面的计划做准备(哈哈哈,懂得都懂)。

先从最简单的样式开始吧。

绑定样式

vue 的样式绑定要人性化很多,react 实现 vue 的这种写法,还需要专门下载一个第三方库: classnames。

vue 的样式绑定有两种形式:对象数组

相对而言,个人还是比较的偏向对象的写法,可能 react 写习惯了吧。原因有两点:

  • 数组能实现的,对象也能使用(反之亦然)。
  • 在 DOM 结构中,使用数组的[]形式,感觉看起来比较的怪异,复杂。

对象

我把对象的形式分为三种场景,分别如下:

场景一:循环列表,根据列表项的某属性的不同而展示不同

 <script setup lang="ts">
 const list = [
   {
     id: "1",
     name: "name1",
     isActive: true,
   },
   {
     id: "2",
     name: "name2",
     isActive: false,
   },
   {
     id: "3",
     name: "name3",
     isActive: false,
   },
 ];
 </script>
 <template>
   <div
     v-for="item in list"
     :key="item.id"
     class="common"
     :class="{ isActive: item.isActive }"
   >
     {{ item.name }}
   </div>
 </template>
 <style>
 .isActive {
   color: red;
 }
 </style>

根据列表项的isActive的属性值不同,来判断是否显示isActive类名。

场景二:通过触发事件,来展示不同的样式。

这种情况一般针对于用户操作,比如点击按钮触发事件,来修改某一内容的样式。

 <script setup lang="ts">
 import { ref } from "vue";
 const isActive = ref<boolean>(false);
 // 事件改变 data 属性值
 const btn = () => {
   isActive.value = !isActive.value;
 };
 </script>
 <template>
   <div class="common" :class="{ isActive: isActive }">文字说明</div>
   <button @click="btn">改变样式</button>
 </template>
 <style>
 .common {
   font-size: 20px;
 }
 .isActive {
   color: red;
 }

通过点击事件,修改 data 中的值,从而影响到 div 标签的类名展示。

情况三:当关联多个动态样式,直接绑定一个对象

上面的情况,当存在少量的动态样式(1~2个)的时候,可以直接写在DOM结构中,阅读性可观。当存在多个的时候,还这样写的话,可能 DOM 就显的混乱了,阅读性极低,这时借助一个对象就很好的解决了这个问题。

 <script setup lang="ts">
 import { reactive } from "vue";
 const classObj = reactive({
   isActive: true,
   hasError: false,
   textRed: true,
 });
 </script>
 <template>
   <div class="common" :class="classObj">文字说明</div>
 </template>

数组

数组的写法,对于个人来说,就大致的了解下就行了。

形式一:绑定多个class

 <script setup lang="ts">
 import { ref } from "vue";
 const activeClass = ref("active");
 const errorClass = ref("text-danger");
 </script>
 <template>
   <div :class="[activeClass, errorClass]"></div>
 </template>

最后渲染出来的结果:

 <div class="active text-danger"></div>

形式二:数组中的判断

 <!--三目运算符的判断-->
 <div :class="[isActive ? activeClass : '', errorClass]"></div>
 <!--数组中嵌套对象的判断-->
 <div :class="[{activeClass: isActive}, errorClass]"></div>

vue 中的动态 style 跟 class 的用法基本相似的,就不用多说了。

透传的attributes

在上面的样式绑定中,都是把 class 写在了原生标签上,那么如果把 class 写在组件上,效果是什么呢?

在此之前,先来弥补两个小知识点。

知识点一:vue3 支持多个根节点

 <!--vue2: 错误的写法-->
 <template>
   <div></div>
   <div></div>
 </template>
 <!--vue3: 正确-->
 <template>
   <div></div>
   <div></div>
 </template>

知识点二:什么是透传的attributes?

“透传 attribute”指的是传递给一个组件,却没有被该组件声明为 propsemits 的 attribute 或者 v-on 事件监听器。常见的有 class style id.

简单的理解就是:传递给子组件的属性,但是被没有在子组件声明,就是透传 attributes

准备工作完成,可以开始正题了。

透传 attributes 之样式绑定

分为两种情况,只有一个根节点或者多个根节点。

情况一:子组件只有一个根节点

 <!--son子组件-->
 <template>
   <div class="own">son组件</div>
 </template>

存在自身的类名 own

 <!--父组件使用Son-->
 <Son class='abc' />

class 并没有在 props 中申明,那么它就是透传 attributes。

那么最后渲染的结果:

 <div class='abc own'>son组件</div>

就会主动的绑定到根节点上去,与原来的 class 进行组合。

情况二:子组件有多个根节点

存在多个根节点的时候,并且还传递了透传 attributes,如果没有手动处理的话,是会存在警告的。

 <!--son子组件-->
 <template>
   <div class="own">son组件1</div>
   <div class="own">son组件2</div>
 </template>
 <!--父组件使用Son-->
 <Son class='abc' />

没有处理,抛出警告:

那么处理警告的方式两种:

  • 禁用透传 attributes,设置 inheritAttrs 为 false(后面再说)。
  • 手动处理,具体绑定在哪一个根节点。
 <!--son子组件-->
 <template>
   <div class="own" :class="$attrs['class']">son组件1</div>
   <div class="own">son组件2</div>
 </template>

这样警告也会消失,并且把透传 attributes 绑定在了第一个根节点上。这里的$attrs是一个对象,需要具体指明某个属性。

最后渲染的结果:

 <div class="own abc">son组件1</div>
 <div class="own">son组件2</div>

透传 attributes 之事件绑定

上面只是针对样式进行了透传,那么事件的话,又会是怎么样的呢?

先说结论吧,表现形式跟样式绑定是基本一样的。

 <!--子组件Son-->
 <script setup lang="ts">
 const btn1 = () => {
   console.log("子组件的点击事件");
 };
 </script>
 <template>
   <button @click="btn1">点击</button>
 </template>

现在子组件的根节点是一个 button 标签,并且上面绑定了一个点击事件。

 <!--父组件使用-->
 <script setup lang="ts">
 import Son from "./Son.vue";
 const btn = () => {
   console.log("父组件的点击事件");
 };
 </script>
 <template>
   <Son @click="btn" />
 </template>

父组件调用,也传递了一个透传的事件过来。当点击按钮:

发现,子组件的事件被触发了,父组件传递过来的事件也被触发了,顺序为先子后父

透传的 attributes 基本说完了,接下来就看看几个特殊部分吧。

特殊1:组件嵌套

有些情况下一个组件会在根节点上渲染另一个组件。那么透传 attributes 也会继续传递下去。

 <!--baseChild-->
 <template>
   <div></div>
 </template>
 <!--child-->
 <template>
   <base-child />
 </template>
 <!--father-->
 <Child class='abc'/>

那么最后渲染的结果:

 <div class='abc'></div>

特殊2:禁用透传attributes

设置 inheritAttrs:false,就禁止使用了自动绑定,可以消除前面所说的警告;然后就可以自由的绑定 $attrs, 该对象就包含了传递过来的透传 attributes。

 <!--如果是setup写法,就需要单独添加一个script标签,暴露一个配置对象-->
 <script lang="ts">
 export default {
   inheritAttrs: false, // 禁用
 };
 </script>
 <script setup lang="ts">
 const btn1 = () => {
   console.log("子组件的点击事件");
 };
 </script>
 <template>
   <button @click="btn1">点击</button>
 </template>

需要注意的是:

  • 和 props 有所不同,透传 attributes 在 JavaScript 中保留了它们原始的大小写,所以像 foo-bar 这样的一个 attribute 需要通过 $attrs['foo-bar'] 来访问。
  • 像 @click 这样的一个 v-on 事件监听器将在此对象下被暴露为一个函数 $attrs.onClick

特殊3:在 javascript 中访问透传的attributes

在组件实例中获取,通过 this 的形式

 export default {
   created() {
     console.log(this.$attrs)
   }
 }

总结

回顾了vue中动态绑定样式,还是比较简单;又新学习了一点 vue3 的新知识:透传attributes,收获满满。

参考文档

cn.vuejs.org/guide/essen…

cn.vuejs.org/guide/compo…

以上就是vue3中的透传attributes教程示例详解的详细内容,更多关于vue3透传attributes的资料请关注我们其它相关文章!

(0)

相关推荐

  • jQuery Attributes(属性)的使用(一、属性篇)

    本篇讲解:attr(name),attr(properties),attr(key,value),attr(key,fn),removeAttr(name)的用法. 您对本系列文章有任何建议或意见请发送到邮箱:sjzlgt@qq.com 您可以到jQuery官网来学习更多的有关jQuery知识. 下面的代码,运行后,需要刷新下. jQuery-Attributes-1 .div { width:95%; margin-left:15px; margin-top:15px; margin-righ

  • 详解Vue 多级组件透传新方法provide/inject

    provide / inject 是 2.2 新增的方法,可以以一个祖先组件向所有子孙后代注入依赖(一个内容). provider/inject:简单的来说就是在父组件中通过provider来提供变量,然后在子组件中通过inject来注入变量. Vue 官方警告: provide 和 inject 主要为高阶插件/组件库提供用例.并不推荐直接用于应用程序代码中. 当然,警告只是警告,你完全可以正常使用. 使用方法非常像 data 和 props 的组合大礼包: var Provider = {

  • 聊聊 PHP 8 新特性 Attributes

    PHP8的Alpha版本,过几天就要发布了,其中包含了不少的新特性,当然我自己认为最重要的还是JIT,这个我从2013年开始参与,中间挫折无数,失败无数后,终于要发布的东东. 不过,今天呢,我不打算谈JIT,等PHP8发布了以后,我再单独写个类似<深入理解PHP8之JIT>系列来说吧. 嘿嘿,今天呢,我想谈谈Attributes,为啥呢, 是昨天我看到很多群在转发一个文章,叫做<理解PHP8中的Attributes>,说实在的,这篇文章应该是直接从英文翻译过来的,写的晦涩难懂,很多

  • jQuery Attributes(属性)的使用(二、类篇)

    本系列文章分为:属性篇.类篇.Html代码篇.文本篇.值篇共5篇文章. 本篇讲解:addClass(class),removeClass(class),toggleClass(class)的用法. 您对本系列文章有任何建议或意见请发送到邮箱:sjzlgt@qq.com 您可以到jQuery官网来学习更多的有关jQuery知识. . addClass(class)用法 定义:为每个匹配的元素添加指定的类名. 返回值:Object 参数:class (String) : 一个或多个要添加到元素中的C

  • PHP attributes()函数讲解

    PHP attributes() 函数 实例 返回 XML 的 body 元素的属性和值: <?php $note=<<<XML <note> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body date="2013-01-01" type="private">Don'

  • vue3中的透传attributes教程示例详解

    目录 引言 绑定样式 对象 数组 透传的attributes 透传 attributes 之样式绑定 透传 attributes 之事件绑定 特殊1:组件嵌套 特殊2:禁用透传attributes 特殊3:在 javascript 中访问透传的attributes 总结 引言 最近两年都是在使用 react 进行项目开发,看技术博客都是针对 react 和 javaScript 高级方面的,对 vue 的知识基本上遗忘的差不多了.最近开始慢慢回顾 vue 的知识以及对新的语法进行学习,为后面的计

  • Vue3中Vuex状态管理学习实战示例详解

    目录 引言 一.目录结构 二.版本依赖 三.配置Vuex 四.使用Vuex 引言 Vuex 是 Vue 全家桶重要组成之一,专为 Vue.js 应用程序开发的 状态管理模式 + 库 ,它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化. 一.目录结构 demo/ package.json vite.config.js index.html public/ src/ api/ assets/ common/ components/ store/ index.

  • node.js中Util模块作用教程示例详解

    目录 从类型判断说起 严格相等 Error First & Promise 调试与输出 从类型判断说起 在 JavaScript 中,进行变量的类型校验是一个非常令人头疼的事,如果只是简单的使用 typeof 会到各种各样的问题. 举几个简单的: console.log(typeof null) // 'object' console.log(typeof new Array) // 'object' console.log(typeof new String) // 'object' 后来,大

  • C语言数据结构顺序表中的增删改(头插头删)教程示例详解

    目录 头插操作 头删操作 小结 头插操作 继上一章内容(C语言数据结构顺序表中的增删改教程示例详解),继续讲讲顺序表的基础操作. 和尾插不一样,尾插出手阔绰直接的开空间,咱头插能开吗?好像没听说过哪个接口可以在数据前面开一片空间吧,那我们思路就只有一个了——挪数据.那应该从第一位开始挪吗?注意,这和 memcpy 函数机制是一样的,并不意味着后面数据一起挪动,也不会彼此独立,而是相互影响,挪动的数据会对后面数据进行覆盖. 那我们的逻辑就应该是从后往前挪,那我们就直接定一个下标,指向这段空间的最后

  • vue实例成员 插值表达式 过滤器基础教程示例详解

    目录 一. 什么是Vue 二.为什么学Vue 三.如何使用Vue 下载安装? 插值表达式 四.vue特点 1.虚拟DOM 2.数据的双向绑定 3.单页面应用 4.数据驱动 五.Vue实例 六.实例成员 - 挂载点 | el - 自定义插值表达式括号| delimiters - 数据 | data - 过滤器 | filters - 方法 | methods - js对象(即字典)补充 - 插值表达式转义 | delimters - 计算属性 | computed - 监听属性 | watch 一

  • python中前缀运算符 *和 **的用法示例详解

    这篇主要探讨 ** 和 * 前缀运算符,**在变量之前使用的*and **运算符. 一个星(*):表示接收的参数作为元组来处理 两个星(**):表示接收的参数作为字典来处理 简单示例: >>> numbers = [2, 1, 3, 4, 7] >>> more_numbers = [*numbers, 11, 18] >>> print(*more_numbers, sep=', ') 2, 1, 3, 4, 7, 11, 18 用途: 使用 * 和

  • python函数传参意义示例详解

    目录 C++这样的语言用多了之后,在Python函数传递参数的时候,经常会遇到一个问题,我要传递一个引用怎么办? 比如我们想要传一个x到函数中做个运算改变x的值: def change(y): y += 1 x = 1 print ("before change:", x) change(x) print ("after change: ", x) 得到的结果是 before change: 1 after change:  1 完全没用~~~这是怎么回事? 我来说

  • MySql数据类型教程示例详解

    目录 1.简要概述 2. MySQL数据类型详解 1) 字符串类型 2) 整数类型 3)浮点数类型 4)日期/时间类型 1.简要概述 为什么要开通MySQL这个学习板块呢?因为这是一名数据分析师必要的一项技能.分析数据什么最重要?当然是数据,既然如此!在数据呈现爆发式增长的年代,怎么能够不学学数据库呢?其实这也是很多读者朋友希望看到的,也是他们建议我写的. 难者不会,会者不难!其实网上很多MySQL的总结文章,不可否认,知识点写的都很全,但是呢!这个只是会使用MySQL数据库的朋友的一个查询手册

  • C语言指针教程示例详解

    目录 指针 内存 指针类型 指针运算 二级指针 指针数组 指针 指针提供了对地址操作的一种方法,因此,使用指针可使得 C 语言能够更高效地实现对计算机底层硬件的操作.另外,通过指针可以更便捷地操作数组.在一定意义上可以说,指针是 C 语言的精髓. 概念解释就不去搬原定义了,又臭又长不好理解,精炼两点就是: 1.指针是内存中的一个最小单元的编号,也就是地址: 2.平时我们说的指针,通常是指指针变量,用来存储内存地址的变量 也就是说:指针就是地址,口语中指针通常是指针变量 内存 要搞明白指针首先要搞

  • Go gRPC环境安装教程示例详解

    目录 前言 安装 protobuf 安装相关包 创建并编译proto文件 VSCode-proto3插件介绍 前言 gRPC 是一个高性能.开源和通用的 RPC 框架,面向移动和 HTTP/2 设计,带来诸如双向流.流控.头部压缩.单 TCP 连接上的多复用请求等特.这些特性使得其在移动设备上表现更好,更省电和节省空间占用. 在 gRPC 里客户端应用可以像调用本地对象一样直接调用另一台不同的机器上服务端应用的方法,使得您能够更容易地创建分布式应用和服务. gRPC 默认使用 protocol

随机推荐