• vue中$attrs,$props,$listener


    首先需要弄清楚的是:
    vue中父类在使用子类组件时,默认将绑定事件传给了子类组件的根元素

    例:
    有这样一个组件:
    
    <template>
      <div>
        <button><slot/></button>
      </div>
    </template>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    使用该组件:
     <Button @click="xxx" @focus="yyy" size="small">I'm button</Button>
    
    • 1
    • 2

    以上例子中,click、focus事件的作用范围是组件的根结点

    ,而通常,我们是想在上绑定事件,所以要取消事件,然后再手动绑定到上。

    在子类组件的选项中设置:inheritAttrs:false,组件的根元素就会取消继承,绑定事件无效。

    事件无效后,需要将事件手动绑定到想要绑定的组件某元素上,即:
    <div><button v-bind="$attrs"></button></div>
    
    • 1
    • 2
    $attrs
    $attrs:包含了在使用组件时设置的所有属性,包括绑定事件;
    $attrs等同于setup里面的context.attrs。
    而v-bind="$attrs中,$attrs包含了size和绑定事件,需要分离出来:
      setup(props, context){
        const {size, ...rest} = context.attrs
        return {size, rest}
      }
    那么:v-bind="rest"
    <div><button v-bind="rest"></button></div>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    总结
    对于属性size而言,如果在组件中props声明过size,那么 a t t r s 里就不会出现 s i z e 了。虽然 i n h e r i t A t t r s : f a l s e ,但 attrs里就不会出现size了。 虽然inheritAttrs:false,但 attrs里就不会出现size了。虽然inheritAttrs:false,但attrs里面该有的还是有,只是绑定事件无效了,需要手动绑定一下。
    props和 a t t r s 区别通过以上, p r o p s 和 attrs区别 通过以上,props和 attrs区别通过以上,propsattrs的区别显而易见。

    props 是父类向子类传递并且需要子类主动接收的属性,当然props不包含事件;
    $attrs 默认是父类传递到子类根元素的属性,子类不用主动接收,会直接放在子类根元素上。
    而$attrs 的这种默认行为,可以通过设置inheritAttrs:false,这些默认行为将会被取消。
    
    • 1
    • 2
    • 3

    其实 a t t r s , attrs, attrslisteners,$props都是一样的,我们可以通过当前组件实例访问到,具体包含如下:

    $attrs:当前组件的属性,通俗的讲也就是在组件标签定义的一系列属性,如input的value,placeholder等,但是不包括在当前组件里面定义的props属性

    $listeners:当前组件监听的事件,通俗的讲也就是在使用组件的时候在标签中定义的事件,如@input,以及一些自定义事件@tempFn等

    p r o p s :当前组件从父组件那里接收的参数,通俗的讲和 props:当前组件从父组件那里接收的参数,通俗的讲和 props:当前组件从父组件那里接收的参数,通俗的讲和attr差不多,但是只包括在当前组件中定义了的props属性

    通俗的讲 a t t r s + attrs+ attrs+props = 在使用组件时定义的所有属性,不包括事件

    那么在当前组件中使用v-bind=“ a t t r s " , v − b i n d = " attrs",v-bind=" attrs"vbind="props”,v-on="$listeners"也就是把之前父组件那里给它的属性再全部传到它的子组件。

  • 相关阅读:
    第四周 牛背山云海——拍拍大场景,自拍延时片段
    调整SGA遇到ORA-00845错误
    CDH大数据平台 24Cloudera Manager Console之hbase、hive整合配置(markdown新版)
    SSM框架基于h5的校园兼职招聘系统的设计与实现源码+论文三稿+ppt+查重报告(包远程安装,已降重)
    内核对设备树的处理__对设备树中平台信息的处理(选择machine_desc)
    【听课笔记】复旦大学遗传学_04连锁与交换
    C++ 空类中有哪些成员函数
    springboot之使用http发送文件
    国庆10.01
    2022-08-19 Mysql--数据库事务
  • 原文地址:https://blog.csdn.net/axzzy/article/details/133740970