首页 > 其他分享 >vue透传 Attributes

vue透传 Attributes

时间:2023-06-27 22:11:38浏览次数:34  
标签:vue 绑定 透传 点击 事件 attributes 组件 Attributes

Attributes 继承​

在此之前,先来弥补一个小知识点,vue3支持多个根节点,vue2不支持,

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

“透传 attribute”指的是传递给一个组件,却没有被该组件声明为 props 或 emits 的 attribute 或者 v-on 事件监听器。最常见的例子就是 class、style 和 id。

当一个组件以单个元素为根作渲染时,透传的 attribute 会自动被添加到根元素上。举例来说,假如我们有一个 MyButton 组件,它的模板长这样:

<!-- <MyButton> 的模板 -->
<button>click me</button>

一个父组件使用了这个组件,并且传入了 class:

<MyButton class="large" />

最后渲染出的 DOM 结果是:

<button class="large">click me</button>
这里,MyButton 并没有将 class 声明为一个它所接受的 prop,所以 class 被视作透传 attribute,自动透传到了 MyButton的根元素上。

多个根节点

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

那么处理警告的方式两种:
禁用透传 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>

v-on 监听器继承

透传 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>

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

现,子组件的事件被触发了,父组件传递过来的事件也被触发了,顺序为先子后父。
透传的 attributes 基本说完了,接下来就看看几个特殊部分吧。

禁用透传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。

标签:vue,绑定,透传,点击,事件,attributes,组件,Attributes
From: https://www.cnblogs.com/coderz1/p/17510051.html

相关文章

  • vue模板大小写区分
    HTML标签和属性名称是不分大小写的,所以浏览器会把任何大写的字符解释为小写。这意味着当你使用DOM内的模板时,无论是PascalCase形式的组件名称、camelCase形式的prop名称还是v-on的事件名称,都需要转换为相应等价的kebab-case(短横线连字符)形式://JavaScript中的ca......
  • vue3 defineExpose()
    使用scriptsetup的组件是默认关闭的——即通过模板引用或者$parent链获取到的组件的公开实例,不会暴露任何在scriptsetup中声明的绑定。可以通过defineExpose编译器宏来显式指定在scriptsetup组件中要暴露出去的属性:<scriptsetup>import{ref}from'vue'const......
  • vue3自定义hook
    什么是hookshook是钩子的意思,看到“钩子”是不是就想到了钩子函数?事实上,hooks还真是函数的一种写法。vue3借鉴reacthooks开发出了CompositionAPI,所以也就意味着CompositionAPI也能进行自定义封装hooks。vue3中的hooks就是函数的一种写法,就是将文件的一些单独功......
  • vue组件动态缓存与动态刷新
    动态缓存前言在项目中,为了减少性能消耗,有时我们需要使用keep-alive把组件缓存起来,但是并不是所有组件都需要被缓存,那么如何控制那些组件需要缓存呢?主要使用到路由meta,路由前置守卫,vux,动态组件。实现APP.vue<scriptsetup>import{ref,computed}from'vue'import{useRo......
  • vue3标准开发过程
    1.如何用脚手架快速新建一个vue3项目安装vue-cli后,用如下命令创建 vuecreatemy-vue3-project 默认创建vue3项目,直接回车即可。 新建完成后,如何引入element-plus? 用Webstrom打开项目,先运行一次npminstall然后运行npminstallelement-plus--save 然后打开m......
  • vue新建项目标准流程
    1、如何做到快速创建Vue2项目:要快速创建Vue2项目,可以按照以下步骤进行操作:步骤1:确保已经安装了Node.js和npm(Node.js的包管理器)。步骤2:打开终端或命令提示符,进入你想要创建项目的目录。步骤3:运行以下命令安装VueCLI(命令行工具):[email protected]步骤4:创建一个......
  • 基于vue +Java+springboot+element-ui开发的智慧班牌系统源码
    电子班牌系统又称之为智慧班牌,是当前校园数字化信息化建设、文化建设的主流,是校园日常工作安排、校园信息发布、班级文化风采展示、课堂交流、家校互通的重要应用载体。在每个班级门口安装一台电子班牌终端,实现学校日常管理、校园信息化建设数据对接,为学生提供一个德智教育文化环境......
  • vue插槽
    什么是插槽在日常的项目开发中,当我们在编写一个完整的组件时,不可避免的会引用一些外部组件或者自定义组件。有了这种引用关系之后,我们就可以把它们称为父组件或者子组件,同时父子组件之间有很多的通信方式,比如可以通过props向子组件传递数据,或者通过$emit、$parent调用父组件中......
  • VUE框架组件中通信方式(3)
    useAttrs使用方式类似于props传值,useAttrs既可以传数据,也可以传事件。如果父组件给子组件传递的参数,在子组件中同时使用props和useAttrs获取,那么参数只在props中生效,也就是说props的优先级高于useAttrs。示例代码如下://template><div><h1>useAttrs</h1><el-but......
  • vue中精确计算问题,出现很多位小数的问题与原因
    出现的原因计算机把小数转换成二级制,会出现无限循环的情况。再把无限循环的二级制转化成十进制的时候,变成了一个无限循环的数字。在处理双精度浮点数的小数部分最多支持52位,所以转换成十进制之后,就出现了很多位小数的存在。例如:0.1+0.2=0.300000000000000040.3-0.2=......