• 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"也就是把之前父组件那里给它的属性再全部传到它的子组件。

  • 相关阅读:
    基于GPT搭建私有知识库聊天机器人(五)函数调用
    【CSDN竞赛题解】判断题:脉冲调制编码(PCM),选择题:以下哪一种常见的文件格式与增量编码无关?哪一项不是自适应差分脉冲调制编码(ADPCM..,编程题:小球游戏,王子闯闸门
    MySQL索引详解
    el-table根据data动态生成列和行
    php+sql后台实现从主表迁出至副表(数据超万条)
    foxmail群发邮件怎么发?
    【MAPBOX基础功能】18、mapbox添加pbf矢量切片图层
    vue3项目学习二:搭建项目架构
    【WSN】无线传感器网络 X-Y 坐标到图形视图和位字符串前缀嵌入方法研究(Matlab代码实现)
    照片人像模糊怎么调?两分钟教会你
  • 原文地址:https://blog.csdn.net/axzzy/article/details/133740970