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