百科狗-知识改变命运!
--

attribute 透传 - 自动添加到根元素的 attribute 中 - vue 组件

是丫丫呀1年前 (2023-11-21)阅读数 12#技术干货
文章标签组件

attribute 透传

“透传 attribute”的意思是把attribute透漏给一个组件,或者把 v-on 事件监听器传递一个组件。但在所接收组件上,并没有显式地声明的propsemits来接收。最常见的例子就是classstyleid attribute。

Attribute 继承

当一个组件以单个元素为根作渲染时,透传的 attribute 会自动添加到根元素的 attribute 中。

attribute 透传 - 自动添加到根元素的 attribute 中 - vue 组件

举个例子,下面这个组件有这样的模板:

click me

一个父组件使用了这个组件:

最后渲染出的 DOM 结果是:

click me


对 class 和 style 的合并

如果一个子组件的根元素已经有了classstyle attribute,它会和从父组件上继承的值合并。

将之前的组件的模板改成这样:

click me

最后渲染出的 DOM 结果是:

click me


v-on 监听器继承

同样的规则也适用于v-on事件监听器:

监听器 click 会被添加到的根元素,即那个原生的元素之上。当原生的被点击,会触发父组件的onClick方法。如果原生button元素已经通过v-on绑定了一个事件监听器,则这些监听器都会被触发。


深层组件继承

如果一个组件在根节点上渲染另一个组件,例如,我们重构一下,让它在根节点上渲染

此时接收的透传 attribute 会直接传向

请注意:

  • 直传的 attribute 不会包含上声明过的props或是针对emits声明事件的 v-on 侦听函数,换句话说,声明过的props和侦听函数被“消费”了。
  • 直传的 attribute 若符合声明,也可以作为props传入


禁用 Attribute 继承

如果你不想要一个组件自动地继承 attribute,你可以在组件选项中设置inheritAttrs:false。

如果你使用了

最常见的需要禁用 attribute 继承的场景,就是 attribute 需要应用在根节点以外的其他元素上。通过设置inheritAttrs:false,你可以完全控制透传进来的 attribute 如何应用。


这些透传进来的 attribute,可以在模板的表达式中,直接用$attrs访问到。

Fallthrough attribute: {{ $attrs }}

这个$attrs对象包含了除组件的propsemits属性外的所有其他 attribute,例如classstylev-on监听器等等。


注意:
  • 和props有所不同,透传attributes在 JavaScript 中保留了它们原始的大小写,所以像foo-bar这样的一个 attribute 需要通过$attrs['foo-bar']来访问。
  • @click这样的一个v-on事件监听器将在此对象下被暴露为一个函数$attrs.onClick。


现在我们要再次使用一下之前小节中的组件例子。有时候我们可能为了样式,需要在元素外包装一层

click me

我们想要所有像 class 和 v-on 监听器这样的透传 attribute 都应用在内部的上而不是外层的

上。我们可以通过设定inheritAttrs:false和使用v-bind="$attrs"来实现:
click me

请记住:没有参数的v-bind会将一个对象的所有属性,都作为 attribute 应用到目标元素上


多根节点的 Attribute 继承

和单根节点组件有所不同,有着多个根节点的组件没有自动 attribute 透传行为。如果$attrs没有被显式绑定,将会抛出一个运行时警告。

如果有下面这样的多根节点模板,由于 Vue 不知道要将 attribute 透传到哪里,所以会抛出一个警告。

...
...
...

如果$attrs被显式绑定,则不会有警告:

...
...
...


在 JavaScript 中访问透传 Attributes

如果需要,你可以在

如果没有使用,attrs会作为setup()上下文对象的一个属性暴露:

export default {
  setup(props, ctx) {
    // 透传 attribute 被暴露为 ctx.attrs
    console.log(ctx.attrs)
  }
}

需要注意的是,虽然这里的attrs对象总是反映为最新的透传 attribute,但它并不是响应式的(考虑到性能因素)。你不能通过侦听器去监听它的变化。

若侦听器去监听此数据的变化,可以使用prop传递数据的具备响应性。侦听器去监听此数据的变化,还可以使用onUpdated()使得在每次更新时结合最新的attrs执行effect副作用。

鹏仔微信 15129739599 鹏仔QQ344225443 鹏仔前端 pjxi.com 共享博客 sharedbk.com

免责声明:我们致力于保护作者版权,注重分享,当前被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理!邮箱:344225443@qq.com)

图片声明:本站部分配图来自网络。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

内容声明:本文中引用的各种信息及资料(包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主体(包括但不限于公司、媒体、协会等机构)的官方网站或公开发表的信息。部分内容参考包括:(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供参考使用,不准确地方联系删除处理!本站为非盈利性质站点,本着为中国教育事业出一份力,发布内容不收取任何费用也不接任何广告!)