vue中$attrs,$props,$listener

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

例:
有这样一个组件:

<template>
  <div>
    <button><slot/></button>
  </div>
</template>

使用该组件:
 <Button @click="xxx" @focus="yyy" size="small">I'm button</Button>

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

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

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

事件无效后,需要将事件手动绑定到想要绑定的组件某元素上,即:
<div><button v-bind="$attrs"></button></div>
$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>

总结
对于属性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,这些默认行为将会被取消。

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

### attrs listener 的定义 #### 属性 (Attributes) 属性通常指的是 HTML 元素上附加的数据项,这些数据用于配置元素的行为或外观。在 JavaScript 中,可以通过 `getAttribute` 方法获取指定的属性值,并通过 `setAttribute` 修改其值。 ```javascript // 获取属性 const element = document.getElementById('myElement'); let attributeValue = element.getAttribute('data-custom'); // 设置属性 element.setAttribute('data-custom', 'newValue'); ``` 对于框架而言,如 React 或 Vue.js, 组件也可以拥有属性(props),用来传递来自父组件的信息[^1]。 #### 事件监听器 (Listeners) 事件监听器则是指注册给特定 DOM 节点的一段代码逻辑,在触发相应类型的交互行为时自动调用这段代码来响应用户的操作或其他条件变化。常见的有点击、输入框失去焦点等事件处理程序。 ```javascript // 添加单个事件监听器 document.querySelector('#button').addEventListener('click', function(event){ console.log('Button clicked!'); }); // 移除事件监听器 function handleClick() { /* ... */ } someElement.addEventListener('mousedown', handleClick); someElement.removeEventListener('mousedown', handleClick); ``` ### 差异对比 - **目的不同**: Attributes 主要是描述性的静态信息;而 Listeners 则是用来动态捕捉并回应用户动作或者其他环境改变。 - **生命周期管理** : Attribute 可能在页面加载完成后就不再变动;相比之下 Listener 需要在适当时候添加移除以防止内存泄漏等问题的发生。 - **应用场景** :当需要向网页元素提供额外参数或者样式设置的时候会使用 attributes 。如果是要实现交互功能,则更倾向于采用 listeners 来完成。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值