饥人谷技术博客

Vue 事件属性绑定默认和修改

2021-12-13  本文已影响0人  飞天小猪_pig

Buttondemo组件

<template>
    <Button @click="onClick">你好</Button>
</template>
<script lang="ts">
import Button from '../lib/Button.vue'
export default {
    components:{Button},
    setup(){
      const onClick=()=>{
        console.log('hi')
      }
      return {onClick}
    }
}
</script>

一、Button组件根元素是button

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

当我们点击Buttondemo组件click事件时候,正常情况下,点击完就会将事件传入到Button组件中根元素button上。这时我们点击打印出“hi”


1.png

但是如果Button组件根元素不是button,而是div时候,这个时候事件是传入div上,而不是button元素上。

二、Button组件根元素是div

<template>
    <div>
        <button>
            <slot />
        </button>
    </div>
</template>
<style lang="scss" scoped>
  div{
      border:1px solid red;
  }
</style>

当我们点击Buttondemo组件click事件时候,点击完就会将事件传入到Button组件中根元素div上,这时只要我们点击这个div边框之内都能触发click事件。


2.png

三、如何让根元素div里面button触发click事件,
(1)、首先让div不要继承click属性:inheritAttrs:false
(2)、让div里的button绑定事件:v-bind=$attrs $attrs是指所有事件

<template>
<div>
    <button v-bind=$attrs>
        <slot />
    </button>
</div>
</template>
<script lang="ts">
export default {
    inheritAttrs:false    //
}
</script>
<style lang="scss" scoped>
  div{
      border:1px solid red;
  }
</style>

四、当有多个事件属性传入,如何自主放置在不同元素进行触发
(1)、利用context.attrs获取所有属性
(2)、利用ES6析构函数{size,focus,mouseover,click}=context.attrs
(3)、再在不同元素上绑定上面size或focus等

Buttondemo组件

<template>
   <div>
        Button示例
    </div>
    <h1>示例1</h1>
    <div>
        <Button @click="onClick"
                @focus="onClick"
                @mouseover="onClick"
                size="small"
        >你好</Button>
    </div>
</template>

Button组件

<template>
    <div :size="size">
        <button v-bind="rest">
            <slot />
        </button>
    </div>
</template>
<script lang="ts">
export default {
    inheritAttrs:false,
    setup(prop,context){
       const {size,...rest} = context.attrs  //context里面有attrs属性
       return {size,rest}
   }
}
</script>
上一篇下一篇

猜你喜欢

热点阅读