官网:https://cn.vuejs.org/guide/components/attrs.html
Attributes 继承
“透传 attribute”指的是传递给一个组件,却没有被该组件声明为 props
或 emits
的 attribute
或者 v-on
事件监听器。最常见的例子就是 class
、style
和 id
。当一个组件以单个元素为根作渲染时,透传的 attribute
会自动被添加到根元素上。
<!-- <MyButton> 的模板 -->
<button>click me</button>
一个父组件使用了这个组件,并且传入了 class
:
<MyButton class="large" />
最后渲染出的 DOM 结果是:
<button class="large">click me</button>
这里,<MyButton>
并没有将 class
声明为一个它所接受的 prop
,所以 class
被视作透传 attribute
,自动透传到了 <MyButton>
的根元素上。同样的规则也适用于 v-on
事件监听器
禁用 Attributes 继承
如果你不想要一个组件自动地继承 attribute
,你可以在组件选项中设置 inheritAttrs: false
。
如果你使用了 <script setup>
,你需要一个额外的 <script>
块来书写这个选项声明:
<script>
// 使用普通的 <script> 来声明选项
export default {
inheritAttrs: false
}
</script>
<script setup>
// ...setup 部分逻辑
</script>
最常见的需要禁用 attribute
继承的场景就是 attribute
需要应用在根节点以外的其他元素上。通过设置 inheritAttrs
选项为 false
,你可以完全控制透传进来的 attribute
被如何使用。
这些透传进来的 attribute
可以在模板的表达式中直接用 $attrs
访问到。
<span>Fallthrough attribute: {{ $attrs }}</span>
这个 $attrs
对象包含了除组件所声明的 props
和 emits
之外的所有其他 attribute
,例如 class
,style
,v-on
监听器等。
- 和
props
有所不同,透传attributes
在JavaScript
中保留了它们原始的大小写,所以像foo-bar
这样的一个attribute
需要通过$attrs['foo-bar']
来访问。 - 像
@click
这样的一个v-on
事件监听器将在此对象下被暴露为一个函数$attrs.onClick
。
我们想要所有像 class
和 v-on
监听器这样的透传 attribute
都应用在内部的 <button>
上而不是外层的 <div>
上。我们可以通过设定 inheritAttrs: false
和使用 v-bind="$attrs"
来实现:
<div class="btn-wrapper">
<button class="btn" v-bind="$attrs">click me</button>
</div>
小提示:没有参数的
v-bind
会将一个对象的所有属性都作为attribute
应用到目标元素上。
多根节点的 Attributes 继承
和单根节点组件有所不同,有着多个根节点的组件没有自动 attribute
透传行为。如果 $attrs
没有被显式绑定,将会抛出一个运行时警告。
<CustomLayout id="custom-layout" @click="changeValue" />
如果 <CustomLayout>
有下面这样的多根节点模板,由于 Vue
不知道要将 attribute
透传到哪里,所以会抛出一个警告。
<header>...</header>
<main>...</main>
<footer>...</footer>
如果 $attrs
被显式绑定,则不会有警告:
<header>...</header>
<main v-bind="$attrs">...</main>
<footer>...</footer>
在 JavaScript 中访问透传 Attributes
如果需要,你可以在 <script setup>
中使用 useAttrs()
API 来访问一个组件的所有透传 attribute
:
<script setup>
import { useAttrs } from 'vue'
const attrs = useAttrs()
</script>
如果没有使用 <script setup>
,attrs
会作为 setup()
上下文对象的一个属性暴露:文章来源:https://www.toymoban.com/news/detail-433465.html
export default {
setup(props, ctx) {
// 透传 attribute 被暴露为 ctx.attrs
console.log(ctx.attrs)
}
}
需要注意的是,虽然这里的 attrs
对象总是反映为最新的透传 attribute
,但它并不是响应式的 (考虑到性能因素)。你不能通过侦听器去监听它的变化。如果你需要响应性,可以使用 prop
。或者你也可以使用 onUpdated()
使得在每次更新时结合最新的 attrs
执行副作用。文章来源地址https://www.toymoban.com/news/detail-433465.html
到了这里,关于Vue3透传Attributes的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!