返回

走进组件中的$attrs和$listeners的应用舞台

前端

组件通信的多种方式
在当今前端界,组件通信一直是绕不开的一个话题。组件通信可以有以下方式:

  • props
  • emit & on
  • vuex
  • 事件总线
  • provide & inject

每个通信方式都有各自的适用场景,此处不再赘述。

本篇文章,我想着重谈谈attrs和listeners两个神奇的属性。这两个属性没有在 Vue 文档中明确提及,但是它们确实存在,并且在某些情况下非常有用。

认识$attrs

attrs 属性是一个只读属性,它包含了父组件传递给子组件的所有属性,但不包括 props。也就是说,如果父组件传递给子组件一个不是props的属性,那么这个属性将被放在attrs中。

<!-- 父组件 -->
<template>
  <child-component :name="name" age="20"></child-component>
</template>

<!-- 子组件 -->
<template>
  <div>
    <p>姓名:{{ name }}</p>
    <p>年龄:{{ $attrs.age }}</p>
  </div>
</template>

在上面的例子中,子组件通过$attrs.age访问到了父组件传递的age属性。

认识$listeners

listeners 属性也是一个只读属性,它包含了父组件传递给子组件的所有事件监听器。也就是说,如果父组件给子组件添加了一个事件监听器,那么这个监听器将被放在listeners中。

<!-- 父组件 -->
<template>
  <child-component @click="handleClick"></child-component>
</template>

<!-- 子组件 -->
<template>
  <div @click="$listeners.click">
    点击我
  </div>
</template>

在上面的例子中,子组件通过$listeners.click访问到了父组件传递的click事件监听器。

attrs和listeners的应用场景

attrs和listeners通常用于以下场景:

  • 当子组件需要访问父组件传递的非props属性时。
  • 当子组件需要监听父组件传递的事件时。
  • 当子组件需要将父组件传递的属性和事件传递给孙组件时。

需要注意的是,attrs和listeners都是只读属性,这意味着它们只能被用来访问数据,而不能用来修改数据。

结语

attrs和listeners是两个非常有用的属性,它们可以帮助我们在组件之间传递数据和事件。在某些情况下,使用attrs和listeners可以使我们的代码更加简洁和易于维护。