一 什么是useAttrs

useAttrs 是 Vue 3 Composition API 中提供的一个函数,它属于 Vue 的组合式 API 工具集的一部分。通过 useAttrs,你可以访问传递给组件但未被声明为 props 的所有属性。这对于处理非 prop 特性(attributes)特别有用,比如 HTML 特性或自定义数据特性等。

它返回的是一个响应式对象,包含了父组件传递下来的所有非 prop 属性(如 class, style, id, data-* 等 HTML 原生属性),以及监听器(如 @click, @input 等)。 

使用场景

  • 当你需要获取没有在 props 中声明的属性时。
  • 在需要将属性透传(attribute inheritance)到子组件或根元素时非常有用。

 

二  基本使用 

       需要引用element-plus

        npm install element-plus --save

        main.js中引用element-plus

        import ElementPlus from 'element-plus'

        import 'element-plus/dist/index.css'

        app.use(ElementPlus)

父组件Parent.vue

<template>
    <div class="props-text">
        <h1>useAttrs</h1>
        <!--useAttrs() 是 Vue 3 Composition API 中的一个函数,
        用于访问当前组件的 非 props 属性(non-prop attributes)。
        这些属性通常包括 class、style、id、原生 HTML 属性等。
       
        -->
        <h1>我是父组件</h1>
        <el-button type="primary" size="small" :icon="Edit"></el-button>
        <hr>
        <CustomButton type="primary" size="small" :icon="Edit" title="编辑" @click="handler"></CustomButton>
    </div>
</template>
<script setup>
//引入图标按钮  网址:https://element-plus.org/zh-CN/component/button.html
import {
  Check,
  Delete,
  Edit,
  Message,
  Search,
  Star,
} from '@element-plus/icons-vue'
import CustomButton from './CustomButton.vue';

const handler = () => {
  console.log('点击了按钮');
}
</script>



<style scoped>
.props-text {
    width: 400px;
    height: 400px;
    background-color: burlywood;
}
</style>

自定义按钮组件CustomButton.vue

<template>
<div>
    <el-button v-bind="$attrs"></el-button>
    <el-button :="$attrs"></el-button>
    <el-button :type="$attrs.type" :size="$attrs.size" :icon="$attrs.icon"></el-button>
</div>
</template>

<script setup>
import { useAttrs } from 'vue';
let $attrs = useAttrs();

let props = defineProps(['title'])
console.log(props.title);
console.log($attrs);
//同时使用 $attrs 和 props  优先props 会导致 $attrs.title 丢失
</script>

<style></style>

三 注意事项

注意点 说明
🔁 响应性 attrs 是响应式的,但其值不会触发模板重新渲染。
🧠 非响应式数据 不要试图用 attrs 来驱动响应式逻辑(比如 computed 或 watch)
🧹 清理属性 如果你不希望某些属性被继承,应该使用 inheritAttrs: false 并手动绑定需要的属性
🧑‍🔧 自定义组件开发 常用于封装可复用的基础组件,如 <MyInput><BaseButton> 等
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐