Vue | 透传 Attrs

Posted on Mar 1, 2024

⭐️什么是透传 attrs?

  • 大小写不敏感
  • 维持响应式
    • prop
    • onUpdated()

成功传递给子组件(= 绑定到根元素),但子组件没有用 props 或 emits 声明的 attrs 或 v-on 事件监听器(eg. class/style/id)(反之,用 props/emits 声明过的属性和事件会被「消耗」,不再透传)

  • 父组件使用组件: <Button class="large">,子组件不用 props 接收就能获取 class。所以这里的 class 是一个自动透传到子组件 root element 上的「透传 attrs」
  • 父组件使用组件: <Button @click="onClick">,这里 click 会被添加到子组件的 root element 上

⭐️透传的继承

//App.vue
<template>
	<Button class="small"/>
</template>

//Button.vue
<template>
	<BaseButton />
</template>

Button 组件在根节点上渲染 BaseButton 组件。透传属性会传给 BaseButton

class:app. vue -> button. vue -> basebutton. vue

⭐️禁止透传继承

  • 不想让 attrs 被 basebutton 的根节点继承
<script setup> 
	defineOptions({ inheritAttrs: false }) 
</script>
  • 其它节点要使用透传 attrs,需配合 v-bind="$attrs"

⭐️API

useAttrs() :配合 <script setup> 访问组件的所有透传 attrs