vue中的$attrs和$listeners属性及用法是什么

发布时间:2021-12-28 20:42:12 作者:柒染
来源:亿速云 阅读:321
# Vue中的$attrs和$listeners属性及用法详解

## 前言

在Vue.js开发中,组件间的通信是核心功能之一。除了常见的`props`和`emit`外,Vue还提供了两个强大的属性:`$attrs`和`$listeners`。这两个属性在跨层级组件通信、高阶组件开发等场景中发挥着重要作用。本文将深入探讨它们的定义、使用场景及最佳实践。

## 一、$attrs属性详解

### 1. 基本定义

`$attrs`是Vue 2.4.0+版本引入的一个实例属性,包含父组件传递给子组件的**所有非prop特性**(未在子组件props中声明的属性)。

```javascript
// 父组件
<child-component 
  title="示例标题" 
  data-id="123" 
  class="custom-class" 
  style="color: red"
/>

// 子组件
export default {
  props: ['title'],
  created() {
    console.log(this.$attrs); 
    // 输出: { "data-id": "123", class: "custom-class", style: "color: red" }
  }
}

2. 核心特点

3. 典型使用场景

场景1:透传原生HTML属性

// 基础按钮组件
<template>
  <button v-bind="$attrs">
    <slot></slot>
  </button>
</template>

// 使用时可传递任意button原生属性
<base-button 
  type="submit" 
  disabled 
  aria-label="提交"
>提交</base-button>

场景2:高阶组件封装

// 封装第三方组件时透传所有属性
<template>
  <el-input v-bind="$attrs" />
</template>

场景3:多级组件透传

// 中间组件无需处理属性,直接透传
<template>
  <grand-child v-bind="$attrs" />
</template>

4. Vue 3中的变化

在Vue 3中: - $attrs包含所有透传attribute,包括classstyle - 新增inheritAttrs: false时,不再自动挂载到根元素

二、$listeners属性详解

1. 基本定义

$listeners包含父组件传递给子组件的所有v-on事件监听器(不含.native修饰符的事件)。

// 父组件
<child-component 
  @click="handleClick"
  @focus="handleFocus"
/>

// 子组件
export default {
  created() {
    console.log(this.$listeners);
    // 输出: { click: fn, focus: fn }
  }
}

2. 核心特点

3. 典型使用场景

场景1:创建透明包装组件

// 基础按钮组件增强
<template>
  <button 
    v-on="$listeners"
    @mouseover="handleHover"
  >
    <slot></slot>
  </button>
</template>

场景2:自定义组件的事件代理

// 代理第三方组件事件
<template>
  <el-input v-on="$listeners" />
</template>

场景3:多层级事件传递

// 中间组件透传所有事件
<template>
  <grand-child v-on="$listeners" />
</template>

4. Vue 3中的变化

Vue 3中已移除$listeners,事件监听器也包含在$attrs中,统一通过v-bind="$attrs"传递。

三、组合使用技巧

1. 同时透传属性和事件

<template>
  <component 
    v-bind="$attrs"
    v-on="$listeners"
  />
</template>

2. 选择性合并

<template>
  <input
    :value="value"
    v-bind="filteredAttrs"
    @input="$emit('input', $event.target.value)"
  />
</template>

<script>
export default {
  computed: {
    filteredAttrs() {
      const { class: _, style: __, ...rest } = this.$attrs;
      return rest;
    }
  }
}
</script>

3. 与v-model集成

// 自定义组件支持v-model
<template>
  <input
    v-bind="$attrs"
    v-on="inputListeners"
  />
</template>

<script>
export default {
  computed: {
    inputListeners() {
      return {
        ...this.$listeners,
        input: event => this.$emit('input', event.target.value)
      }
    }
  }
}
</script>

四、最佳实践与注意事项

1. 明确组件接口

2. 属性过滤策略

// 过滤掉特定属性
computed: {
  filteredAttrs() {
    const { title, ...rest } = this.$attrs;
    return rest;
  }
}

3. 性能优化

4. 调试技巧

// 在生命周期中观察变化
mounted() {
  console.log('Current attrs:', this.$attrs);
  console.log('Current listeners:', this.$listeners);
}

五、Vue 3中的变化总结

  1. 属性合并$attrs包含属性和事件监听器
  2. class/style处理:默认包含在$attrs
  3. 移除$listeners:所有监听器通过$attrs访问
  4. 新APIuseAttrs()组合式API
// Vue 3示例
import { useAttrs } from 'vue';

export default {
  setup() {
    const attrs = useAttrs();
    console.log(attrs.onClick); // 访问事件
    return { attrs };
  }
}

结语

$attrs$listeners是Vue组件通信体系中的重要补充,特别适合构建可复用的高阶组件。理解它们的运作机制可以帮助开发者写出更灵活、更易维护的组件代码。随着Vue 3的普及,虽然API有所调整,但核心思想仍然适用。建议在实际项目中多加练习,以掌握这些高级特性的精髓。

注意:本文示例主要基于Vue 2.x版本,Vue 3用户请注意API差异。 “`

这篇文章共计约2500字,全面覆盖了$attrs$listeners的核心概念、使用场景、最佳实践以及Vue 3中的变化,采用Markdown格式编写,包含代码示例和结构化标题,适合作为技术文档阅读。

推荐阅读:
  1. Vue2.4+新增属性.sync、$attrs、$listeners的具体使用
  2. vue计算属性get和set用法示例

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

vue attrs listeners

上一篇:如何进行windows本地提权漏洞CVE-2018-8120复现

下一篇:Python如何处理运动员信息的分组与聚合

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》