Vue3组件事件及属性绑定的小插曲

本文探讨了Vue3中组件事件和属性绑定的问题。默认情况下,子组件的最外层元素会继承事件和属性,可能导致不期望的行为。通过设置`inheritAttrs: false`阻止最外层标签继承属性,并使用`$attrs`批量或按需将属性绑定到内部元素,以实现更精确的事件控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

组件绑定的事件及属性

  1. 默认会让子组件里的最外层标签继承事件及属性(不包括template)
// Demo.vue
<div>
// 这里是Button.vue 组件
	<Button
	@click='console.log(1)'
	@focus='console.log(1)'
	@mouseover='console.log(1)'
	size='big'
	>
	</Button>
</div>

在上面组件中绑定的事件和属性默认都会被下面div继承,假如div宽比button大,则只要鼠标移入div就会触发mousover事件,这是不好的。那么我们应该如何解决这个事?

// Button.vue
<template>
	<div>
		<button>
		</button>
	</div>
</template>

如何让组件的内部的标签触发事件

  1. 第一步先让div不继承属性
    这一步操作就是在 Button.vue 里的 script 里加入 inheritAttrs: false ,这是让组件最外层不继承属性
	// Button.vue
		<template>
			<div>
				<button v-bind="$attrs">
				</button>
			</div>
		</template>
  1. 第二步让div里的标签绑定到属性或者事件
    这里可以用到 $attrs 可以批量绑定属性,就是把组件绑定的事件和属性,全部绑定到button标签上。
    上面是全部绑定在一个标签,其实也可以分开绑定个别属性,那就是在 setup 函数里添加两个参数,props和context,这里用context.attrs获取到的和 $attrs 是一样的再用解构就可以了。
// Button.vue
setup(props,context) {
	const { size, ...rest } = context.attrs
	return { size, rest }
}
// 这样就成功分离出size属性了,再return出去就可以用了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值