首页 > 其他分享 >记录--Vue中的$attrs你真的会用吗?

记录--Vue中的$attrs你真的会用吗?

时间:2024-01-23 20:22:59浏览次数:25  
标签:Vue -- 传递 attrs props 组件 input message

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助

先来看一个业务需求:

项目经常会遇到产品经理要求你做某组件一样的功能,还要在它的基础上增加东西。如何只用少量代码高效的二次封装组件呢?

例如我要做一个element-ui的input组件进行封装,以下是封装要求:

  1. 对el-input组件增加某些定制功能
  2. 调整el-input的原有css样式
  3. 封装后不得更改原有el-input的所有功能

文章最后会给出element-ui的input组件二次封装的示例。

先来介绍一下attrs吧

在 Vue2 中,attr 是指组件接收的 HTML 特性(attribute),通过 props 的方式传递给子组件。而在 Vue3 中,attr 的概念被引入了 Composition API 中,并且被用于管理各种配置项。

下面介绍一些 attr 的使用技巧:

Vue2 中使用 attr

  1. 使用 v-bind指令绑定 HTML 属性

在 Vue2 中,如果想将父组件传递的 HTML 属性传递给子组件进行使用,可以在子组件中通过 props 接收参数,并使用 v-bind 指令将其绑定到子组件的 HTML 元素上。例如:

<template>
  <div class="demo-component" :style="styleObject">{{ message }}</div>
</template>

<script>
export default {
  name: "DemoComponent",
  props: {
    message: String,
    styleObject: Object,
  },
};
</script>

在父组件中使用该组件时,可以通过 v-bind 指令将 HTML 特性传递给子组件:

<template>
  <demo-component message="Hello, world!" :style-object="{ color: 'red' }"></demo-component>
</template>
  1. 使用 $attrs 对象传递所有未被 props 所接收的特性

在 Vue2 中,可以通过 $attrs 对象获取父组件传递给子组件但未被 props 所接收的特性,从而实现组件复用和扩展的目的。例如:

<template>
  <div class="demo-component" :style="styleObject" v-bind="$attrs">{{ message }}</div>
</template>

<script>
export default {
  name: "DemoComponent",
  props: {
    message: String,
    styleObject: Object,
  },
};
</script>

在父组件使用该组件时,可以像平常传递普通的 HTML 特性一样,同时还可以传递一些自定义的特性:

<template>
  <demo-component
    message="Hello, world!"
    :style-object="{ color: 'red' }"
    custom-attribute="something"
  ></demo-component>
</template>

在子组件中,可以通过 this.$attrs 属性获取父组件传递给子组件但未被 props 所接收的特性:

console.log(this.$attrs.customAttribute); // 输出:something

Vue3 中使用 attr

在 Vue3 中,可以通过 setup 函数中的第二个参数 context 来访问该组件的配置选项,其中包括了所有未被 props 所接收的特性:

<template>
  <div class="demo-component" :style="styleObject" v-bind="$attrs">{{ message }}</div>
</template>

<script>
export default {
  name: "DemoComponent",
  props: {
    message: String,
    styleObject: Object,
  },
  setup(props, context) {
    console.log(context.attrs.customAttribute); // 输出:something
  },
};
</script>

在 setup 函数中,通过 context.attrs 获取父组件传递给子组件但未被 props 所接收的特性。

除了 $attrs,Vue3 中还引入了 $props 对象,它是一个由 props 组成的响应式对象,在组件内部通过解构赋值可以快速地访问 props 的属性值:

<template>
  <div class="demo-component" :style="styleObject">{{ message }}</div>
</template>

<script>
export default {
  name: "DemoComponent",
  props: {
    message: String,
    styleObject: Object,
  },
  setup(props) {
    const { message, styleObject } = props;
    console.log(message, styleObject); // 输出:Hello, world! { color: 'red' }
  },
};
</script>

在 setup 函数中,通过解构赋值可以快速地访问 props 的属性值。

利用 $attrs$listeners 可以在二次封装 element-ui 组件时非常方便地传递组件属性和事件。

示例代码

下面以 el-input 组件为例,演示一下vue2中如何高效地二次封装 element-ui 组件,从而达到只用少量代码在原有组件上升级的效果:

<template>
  <el-input v-bind="$attrs" v-on="$listeners" :class="{ 'is-invalid': isError }">
    <template v-if="isError" #append>
      <i class="el-input__icon el-icon-circle-close"></i>
    </template>
  </el-input>
</template>

<script>
export default {
  name: "MyInput",
  inheritAttrs: false,
  props: {
    isError: Boolean, // 是否显示错误提示
  },
};
</script>
<style scoped lang="scss">
//这是写自己的样式内容
</style>

解释一下上面代码的内容吧:

  1. 使用 v-bind="$attrs" 将父级组件所有的未被 props 所接收的特性绑定到 el-input 组件上。

  2. 使用 v-on="$listeners" 将父级组件传递给当前组件的所有事件监听器绑定到 el-input 组件上。

  3. 在模板中可以很方便地使用 isError 属性来扩展组件,并且不需要在父组件中再次定义。

需要注意的是,由于 element-ui 组件本身也包含了一些默认的属性和事件,因此需要在组件中设置 inheritAttrs: false,以避免传递 element-ui 组件自带的属性和事件。

本文转载于:

https://juejin.cn/post/7221357811288260664

如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。

 

标签:Vue,--,传递,attrs,props,组件,input,message
From: https://www.cnblogs.com/smileZAZ/p/17983345

相关文章

  • 哈希学习笔记+杂题(进阶1 字符串哈希)
    哈希杂题前言:竟然下雪了,但是天是灰蒙蒙的。一、哈希学习笔记+杂题(进阶1字符串哈希)相关题单:戳我字符串哈希因为是一种玄学做法,所以具有极强的延展性。所以再碰到字符串的题时,抛开马拉车,kmp,字典树,AC自动机,SA&SAM,先想一下哈希的做法,如果时间复杂度允许,那就可以直接上哈希(虽然你......
  • 00000030.ReverseAnalysis.ring0层注册表监控
    00000030.ReverseAnalysis.ring0层注册表监控links深入理解注册表监控从0环监测注册表机制...好像还是有点门槛的如何监控注册表是windows的重要数据库,存放了很多重要的信息以及一些应用的设置,对注册表进行监控并防止篡改是十分有必要的。在64位系统下微软提供了CmRegiste......
  • React 状态管理 valtio 解析
    valtio是什么valtio是一个很轻量级的响应式状态管理库,它基于Proxy实现,类似于vue的数据驱动视图的理念,使用外部状态代理去驱动React视图更新,不管在react组件内部还是外面都可以使用。下面提供valtio基本用法例子:https://codesandbox.io/embed/5x592g?view=Editor+%2B+Pr......
  • rocketmq--同步、异步、批量、事务消息demo
    在SpringBoot中使用RocketMQ进行同步和异步消息传输的关键是使用RocketMQTemplate类。下面是两个例子,分别演示了如何实现同步和异步消息传输。首先,确保你已经添加了RocketMQ的依赖到你的pom.xml中,如下所示:<dependency><groupId>org.apache.rocketmq</groupId><artifa......
  • 结构体对齐:
    结构体对齐:公式1:前面的地址必须是后面的地址正数倍,不是就补齐公式2:整个Struct的地址必须是最大字节的整数倍练习:StructE1{inta;charb;charc}e1;第一地址肯定存放a是4Byte地址,第二地址,b要1Byte的地址,来欢迎公式一登场:4==1*N(N等于正整数)答"是"!地址现在为......
  • 主席树(可持久化线段树)
    主席树前言主席树也是一种数据结构,是线段树的进阶,作用是可以保留历史版本,支持回退,就是回到之前某个未修改的状态。就像我们在写博客时如果误删了重要的内容,就可以用Ctrl+z撤回一次操作,也可以用Ctrl+Shift+z还原我们撤回的操作,这就需要存下每次编辑的操作。基本原理可......
  • SpringSecurity-手机号+短信验证码登陆
    与验证码登录逻辑是不一样的,所以不能使用SpringSecurity默认提供的那套逻辑;需要自个去写一个自定义身份认证逻辑短信验证码生成生成验证码短信验证码类ValidateCode是父类,ImageCode子类publicclassValidateCode{privateStringcode;/***过期时间......
  • 2024.01 总结
    1.模拟赛总的来说状态较好,只有一次较大的挂分。1-1.优点:思维方面:能够推出DP式子,通过打表找到一些规律。码力方面:基础的数据结构实现很少出错。策略方面:先把自己能拿的分拿满。1-2.缺点:思维方面:推出式子不会优化。码力方面:难以实现复杂的数据结构和代码。......
  • matplotlib数据可视化
    Matplotlib数据可视化基础一、绘制基本图形1、绘制折线图importnumpyasnpimportmatplotlib.pyplotasplt#创建数组xx=np.arange(10)np.random.seed(500)#创建数组yy=np.random.randint(20,size=(10,))plt.plot(x,y,'b-')plt.xticks(fontsize=15)plt.yticks......
  • 寒假学习(13)
    今天我继续学习python知识。今天主要学习的是文件操作,这个知识我从学习C语言开始就一直不熟悉,不仅因为它在教学的最后一章,知识讲的较少,更引文平时学习中基本用不到文件操作,所以这部分我用了很长时间。打开和关闭文件:open() 函数:用于打开一个文件,并返回一个文件对象。有两个......