跳到主要内容

Vue3 属性绑定

Vue3中,在父组件中使用子组件时,传入的属性会默认绑定到子组件的根元素上,如:

<Button 
  size="small"
  @click="onClick" 
  @focus="onFocus" 
  @mouseover="onMouseover"> Test </Button>

子组件如下

<template>
  <div>
    <button>Click me</button>
  </div>
</template>

则Button 组件上的三个事件都会默认绑定到 div 上而不是 button 上。

Q:如果子组件较为简单,则可直接享受 Vue 带来的便利。如果子组件较为复杂,如何手动阻止默认绑定?

A:在子组件中的 script 标签中需要禁用inheritAttrs:继承属性 ,用$attrs 获取所有属性,并且在希望绑定属性的元素上使用 v-bind=”$attrs”

<template>
  <div>
    <button v-bind="$attrs">
    Click me
    </button>
  </div>
</template>

<script>
export default {
	inheritAttrs: false,
};
</script>
// ...

Q:如果属性很多,你想分散绑定到更多元素上,如何实现?

A:通过 setup 中的 context 析构赋值后再分别绑定到对应元素上。

<template>
  <div :size="size">
    <button @Click="onClick">
    Click me
    </button>
  </div>
</template>

<script>
export default {
	inheritAttrs: false,
	setup(props, context) {
		const {onCLick, onMouseover, onFocus} = context.attrs
		return {size, onCLick, onMouseover, onFocus}
	}
};
</script>
// ...

太麻烦了?

还可以使用 ES6 剩余操作符进行批量绑定。

<template>
  <div :size="size">
    <button v-bind="actions">
    Click me
    </button>
  </div>
</template>

<script>
export default {
	inheritAttrs: false,
	setup(props, context) {
		const {size, ...actions} = context.attrs
		return {size, actions}
	}
};
</script>
// ...