在Vue3中,useAttrs是一个用于提供组件属性的自定义hook函数。它的主要作用是为了可以访问到父组件传递给子组件的所有属性。需要注意如果defineProps接受了某一个属性,useAttrs方法返回的对象身上就没有相应属性与属性值。

1
2
3
4
5
6
7
8
9
10
import { defineComponent, useAttrs } from 'vue';
export default defineComponent({
setup(props, context) {
const attrs = useAttrs();

return {
attrs
}
}
})

我们通过useAttrs()将父组件传递给子组件的所有属性挂载到了attrs变量上,从而方便地访问这些属性。

需要注意的是,如果你的组件有某个属性值是动态变化的,则需要通过watch去监听该属性,并在回调函数中手动更新组件状态。因为useAttrs返回的仅仅是父组件传递过来的静态属性值,它并不会自动更新组件状态。
示例:
父组件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<template>
<div>
<h1>useAttrs</h1>
<el-button type="primary" size="small" :icon="Edit"></el-button>
<!-- 自定义组件 -->
<HintButton type="primary" size="small" :icon="Edit" title="编辑按钮" @click="handler" @xxx="handler"></HintButton>
</div>
</template>

<script setup lang="ts">
//vue3框架提供一个方法useAttrs方法,它可以获取组件身上的属性与事件!!!
//图标组件
import {
Check,
Delete,
Edit,
Message,
Search,
Star,
} from "@element-plus/icons-vue";
import HintButton from "./HintButton.vue";
//按钮点击的回调
const handler = ()=>{
alert(12306);
}
</script>

<style scoped>
</style>

子组件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<template>
<div :title="title">
<el-button :="$attrs"></el-button>
</div>
</template>

<script setup lang="ts">
//引入useAttrs方法:获取组件标签身上属性与事件
import {useAttrs} from 'vue';
//此方法执行会返回一个对象
let $attrs = useAttrs();

//万一用props接受title
let props =defineProps(['title']);
//props与useAttrs方法都可以获取父组件传递过来的属性与属性值
//但是props接受了useAttrs方法就获取不到了
console.log($attrs);
</script>

<style scoped>
</style>