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

这篇具有很好参考价值的文章主要介绍了记录--Vue中的$attrs你真的会用吗?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

先来看一个业务需求:

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

例如我要做一个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你真的会用吗?文章来源地址https://www.toymoban.com/news/detail-819290.html

到了这里,关于记录--Vue中的$attrs你真的会用吗?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 快看!华为Python抢购脚本你会用吗?

    目录 1.前言 2.原理 3.下载Python 4.安装浏览器 5.安装浏览器驱动 6.安装依赖包 7.配置文件修改 8.运行main.py 9.特别说明 10.关注我 微信公众号:漫漫编程路 PS:公众号后台回复 “HW” 获取抢购软件!! 1.前言   鉴于最近不少小伙伴的后台的留言与提问,很多是关于该脚本如何使

    2024年01月22日
    浏览(36)
  • Python中最常用的5种线程锁,你都会用吗

    对于日常开发者来讲很少会使用到本章节的内容,但是对框架作者等是必备知识,同时也是高频的面试常见问题。 线程安全是多线程或多进程编程中的一个概念,在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的

    2024年02月08日
    浏览(27)
  • selenium执行js代码的两个方法你都会用吗?

    在使用selenium做web自动化的时候,很多小伙伴反馈有些页面上动作我们无法通过selenium封装的方法直接去做,比如说修改元素的属性,影子节点的操作等等。需要使用原生的js代码去实现,而selenium也给我提供了两个执行js代码的方法,一个是execute_script,另一个是execute_async_s

    2024年04月28日
    浏览(29)
  • 你真的会用 npx 吗❓❓❓

    Hello,大家好! 日常开发中大家应该经常使用 npm install xxx 来安装包依赖,那是否注意到npm升级到 npm@5.2.0 之后,在 npm 二进制命令旁边安装了一个 npx 二进制文件呢? 在没有 npx 命令之前,我们想要执行项目中安装的可执行脚本,以安装 React 创建项目的脚手架 create-react-app 为

    2024年02月02日
    浏览(34)
  • Java 断言 assert 你真的会用嘛?

    Java面试总结汇总,整理了包括Java重点知识,以及常用开源框架,欢迎大家阅读。文章可能有错误的地方,因为个人知识有限,欢迎各位大佬指出!文章持续更新中...... 什么是Java Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、

    2024年02月09日
    浏览(29)
  • 你真的会用async和await么?

    背景就是遇到了一个比较烦人的模块,里面的涉及到了大量的async 和 awiat。发现大多人对这个语法糖一知半解,然后大量的滥用,整理一下 前置知识: 1、async修饰的函数返回一个promise 2、async返回的是一个promise,当async中发生错误,这个错误会使返回的promise变为reject状态,

    2024年02月16日
    浏览(31)
  • 您真的会用百度吗?(百度搜索技巧-超详细)

    目录 · intitle:×× · ×× site:限制网站的域名 · inurl:×× · filetype:pdf/ppt/txt/doc/xls... 匹配符: · 通配符 \\\"?\\\" · 通配符 \\\"*\\\" · 通配符 \\\"() \\\" · \\\"××\\\" · 《》 ·   + ·   - · 用法简介 扩展 · 扩展一:index of ×× 在日常生活中我们多多少少会和百度搜索打交道,那么用了这么

    2023年04月09日
    浏览(28)
  • vue3中setup的两个参数 props,context (attrs,emit,slots),vue3中的双向数据绑定自定义事件emit和v-model

    目录 setup函数 props参数 案例 第一种写法(用setup函数的方式):  第二种方法(语法糖形式即setup写入script标签中)也可以传值,  context (attrs,emit,slots) vue3中的双向数据绑定自定义事件emit和v-model emit自定义事件 v-model 有两个参数分别是 props,context 即 props参数是一个 对象 ,

    2024年02月10日
    浏览(32)
  • 🔥🔥你真的知道TCP协议中的序列号确认、上层协议及记录标识问题吗?

    在前面的内容中,我们已经详细讲解了一系列与TCP相关的面试问题。然而,这些问题都是基于个别知识点进行扩展的。今天,我们将重点讨论一些场景问题,并探讨如何解决这些问题。 当A主机与B主机建立了TCP连接后,A主机发送了两个TCP报文,分别大小为500和300字节。第一个

    2024年02月05日
    浏览(32)
  • 你真的知道TCP协议中的序列号确认、上层协议及记录标识问题吗?

    在前面的内容中,我们已经详细讲解了一系列与TCP相关的面试问题。然而,这些问题都是基于个别知识点进行扩展的。今天,我们将重点讨论一些场景问题,并探讨如何解决这些问题。 当A主机与B主机建立了TCP连接后,A主机发送了两个TCP报文,分别大小为500和300字节。第一个

    2024年01月18日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包