• $attrs 和 $listeners (vue2&&vue3)


    目录

    透传 Attributes

    Attributes 继承​

    对 class 和 style 的合并

    v-on 监听器继承

    深层组件继承 

    禁用 Attributes 继承 

    多根节点的 Attributes 继承 

    vue2 $attrs 和 $listeners 

    $attrs 概念说明

    $attrs 案例

    $listeners 概念说明

    $listeners案例

     vue3 $attrs 和 $listeners 

     attrs在 template 中的用法

    只有1个根元素的情况下

    有2个根元素的情况下

    $listeners  弃用

     attrs在 js 中的用法

    Options API

    Composition API 3.0的语法 

    Composition API 3.2的语法 

    总结

    移除 $listeners 

    概览

    2.x 语法

    3.x 语法

    $attrs 包含 class & style 

    概览

    2.x 行为 

    3.x 行为


    (1)$props:当前组件接收到的 props 对象。Vue 实例代理了对其 props 对象属性的访问。

    (2)$attrs:包含了父作用域中不作为 prop 被识别 (且获取) 的特性绑定 (class 和 style 除外)。

    (3)$listeners:包含了父作用域中(不含 .native 修饰器的)v-on事件监听器。他可以通过 v-on="listeners"传入内部组件

    透传 Attributes

    透传 Attributes 是指由父组件传入,且没有被子组件声明为 props 或是组件自定义事件的 attributes 和事件处理函数。

    Attributes 继承

    “透传 attribute”指的是传递给一个组件,却没有被该组件声明为 props 或 emits 的 attribute 或者 v-on 事件监听器。最常见的例子就是 classstyle 和 id

    当一个组件以单个元素为根作渲染时,透传的 attribute 会自动被添加到根元素上。举例来说,假如我们有一个  组件,它的模板长这样:

    1. <button>click mebutton>

    一个父组件使用了这个组件,并且传入了 class

    <MyButton class="large" />

    最后渲染出的 DOM 结果是:

    <button class="large">click me</button>

     这里, 并没有将 class 声明为一个它所接受的 prop,所以 class 被视作透传 attribute,自动透传到了  的根元素上。

    对 class 和 style 的合并

    如果一个子组件的根元素已经有了 class 或 style attribute,它会和从父组件上继承的值合并。如果我们将之前的  组件的模板改成这样:

    1. <button class="btn">click mebutton>

     则最后渲染出的 DOM 结果会变成:

    <button class="btn large">click me</button>

    v-on 监听器继承

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

    <MyButton @click="onClick" />

    click 监听器会被添加到  的根元素,即那个原生的