自己封装的Switch Button(Vue组件,checkbox改装),同时解决父子组件的事件冒泡问题的新思路

用一晚上的时间自己封装了一个Switch button组件,因为ElementUI里面那个是在是太难用了,尤其是其父组件也有点击事件的时候,解决冒泡问题真是让人头秃。。。

本组件用input checkbox改编的,不具有点击事件,父元素点击时,可以切换是否checked。

本博客方案也为事件冒泡问题提供了一个解决方案,也就是说,尽量让父子组件只有一个有点击事件,要不然只能让子组件有点击事件,然后让子组件通过@click.stop方式禁止冒泡,即,父组件就不具有点击事件了。

这里我们希望点击子组件,父组件点击事件发生,子组件不具备点击事件,所以只能让子组件没有点击事件,具体实现如下:

Switch_button.vue(纯用CSS3动画写的按钮,没有任何点击事件)

<!-- 自己做的Switch button,ElementUI里面那个太鸡儿难用了 -->
<!-- 用checkout button改编的,不具有点击事件,父元素点击时,可以切换是否checked -->
<!-- 按钮尺寸40*20 -->

<template>
    <div id="switch_button_xc">
        <input class="switch switch-anim" type="checkbox" />
    </div>
</template>

<script>
export default {}
</script>

<style scoped>
.switch {
    width: 40px;
    height: 20px;
    position: relative;
    border: 1px solid #dfdfdf;
    background-color: #fdfdfd;
    box-shadow: #dfdfdf 0 0 0 0 inset;
    border-radius: 10px;
    background-clip: content-box;
    display: inline-block;
    -webkit-appearance: none;
    user-select: none;
    outline: none;
    cursor: pointer;
}
.switch:before {
    content: '';
    width: 16px;
    height: 16px;
    position: absolute;
    top: 0.5px;
    left: 1px;
    border-radius: 8px;
    background-color: #fff;
    box-shadow: 0 0 3px rgba(0, 0, 0, 0.4);
}
.switch:checked {
    border-color: #13ce66;
    box-shadow: #13ce66 0 0 0 16px inset;
    background-color: #13ce66;
}
.switch:checked:before {
    left: 21px;
}
.switch.switch-anim {
    transition: border cubic-bezier(0, 0, 0, 1) 0.4s,
        box-shadow cubic-bezier(0, 0, 0, 1) 0.4s;
}
.switch.switch-anim:before {
    transition: left 0.3s;
}
.switch.switch-anim:checked {
    box-shadow: #13ce66 0 0 0 16px inset;
    background-color: #13ce66;
    transition: border ease 0.4s, box-shadow ease 0.4s,
        background-color ease 1.2s;
}
.switch.switch-anim:checked:before {
    transition: left 0.3s;
}
</style>

使用:

<!-- 自己做的Switch button,使用方法 -->
<!-- 点击自己或者父元素可以实现切换 -->

<template>
    <div>
        <div class="father_div" @click="add_prop()">
            <v-switch-button
                ref="switch_button"
            ></v-switch-button>
        </div>
    </div>
</template>

<script>
import Switch_button_diy from '@/components/components_diy/Switch_button.vue' // 组件存放在项目下的地址

export default {
    data() {
        return {
            num: 0 // 0 默认是关上的
        }
    },
    methods: {
        add_prop() {
            if (this.num == 0) {
                this.$refs.switch_button.$el.childNodes[0].checked = true
                this.num = 1
            } else {
                this.$refs.switch_button.$el.childNodes[0].checked = false
                this.num = 0
            }
        }
    },
    components: {
        'v-switch-button': Switch_button_diy
    }
}
</script>

<style scoped>
.father_div {
    width:100px;
    height:100px;
    background:pink;
}
</style>

效果图:(只有粉色父组件和开关,其他为项目中的其他部分,上述代码中没有)

在这里插入图片描述

点击粉色父组件,可以自由切换开关,同时点击开关自己,也可以实现切换。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值