美文网首页
3.vue造轮子-button-group

3.vue造轮子-button-group

作者: 如梦初醒Tel | 来源:发表于2019-07-17 11:21 被阅读0次

前言

image.png

制作如图的效果

新建button-group组件

<template>
    <div class="button-group">
        <slot></slot>
    </div>
</template>
import Vue from 'vue'
import  Button from './button'
import  Icon from './icon'
import  ButtonGroup from './button-group'

Vue.component('g-button',Button);
Vue.component('g-icon',Icon);
Vue.component('g-button-group',ButtonGroup);

new Vue({
    el: "#app",
    data:{
        loading1:false,
        loading2:true,
        loading3:false
    }
});
<div id="app">
    <g-button :loading="loading1" @click="loading1 = !loading1">按钮</g-button>
    <g-button icon="setting" icon-position="left" :loading="loading2" @click="loading2 = !loading2">按钮</g-button>
    <g-button icon="setting" icon-position="right" :loading="loading3" @click="loading3 = !loading3">按钮</g-button>

    <g-button-group>
        <g-button icon="left">上一页</g-button>
        <g-button>更多</g-button>
        <g-button icon="right" icon-position="right">下一页</g-button>
    </g-button-group>
</div>

添加 css样式

<style lang="scss">
    .button-group {
        display: inline-flex;

    }
</style>
image.png

上下不对齐,修改如下

<style lang="scss">
    .button-group {
        display: inline-flex;
        vertical-align: middle;
    }
</style>
image.png

发现一个bug 边框会出现重合

第一种方法 border-left:none

<style lang="scss">
    .button-group {
        display: inline-flex;
        vertical-align: middle;
        border-left: none;
        > .g-button{
            border-radius: 0;
            &:first-child{
                border-top-left-radius: var(--border-radius);
                border-bottom-left-radius: var(--border-radius);
            }
            &:last-child{
                border-top-right-radius: var(--border-radius);
                border-bottom-right-radius: var(--border-radius);
            }
        }
    }
</style>
image.png

设置第一个不修改

<style lang="scss">
    .button-group {
        display: inline-flex;
        vertical-align: middle;
        > .g-button{
            border-radius: 0;
            &:not(:first-child){
                border-left: none;
            }
            &:first-child{
                border-top-left-radius: var(--border-radius);
                border-bottom-left-radius: var(--border-radius);
            }
            &:last-child{
                border-top-right-radius: var(--border-radius);
                border-bottom-right-radius: var(--border-radius);
            }
        }
    }
</style>
image.png

发现bug,如下所示,之后的框都是三边框

image.png

margin-left position z-index

    .button-group {
        display: inline-flex;
        vertical-align: middle;
        > .g-button{
            border-radius: 0;
            margin-left: -1px;
            &:first-child{
                border-top-left-radius: var(--border-radius);
                border-bottom-left-radius: var(--border-radius);
            }
            &:last-child{
                border-top-right-radius: var(--border-radius);
                border-bottom-right-radius: var(--border-radius);
            }
            &:hover{
                position: relative;z-index: 1;
            }
        }
    }
image.png image.png

将子组件全部margin-left左移1px,然后鼠标浮动到该位置时 触发hover里面的条件

最终 bug

如果用户更改了位置会如何???
所以要判断标签是否是button ,不是的话就弹出警告

<div id="app">
    <g-button :loading="loading1" @click="loading1 = !loading1">按钮</g-button>
    <g-button icon="setting" icon-position="left" :loading="loading2" @click="loading2 = !loading2">按钮</g-button>
    <g-button icon="setting" icon-position="right" :loading="loading3" @click="loading3 = !loading3">按钮</g-button>

    <g-button-group>
        <div>
            <g-button icon="left">上一页</g-button>
        </div>
        <g-button>更多</g-button>
        <g-button icon="right" icon-position="right">下一页</g-button>
    </g-button-group>
</div>
image.png

mounted()

<script>
    export default {
        name: "button-group",
        mounted() {
            console.log(this.$children);
        }
    }
</script>
image.png
<script>
    export default {
        name: "button-group",
        mounted() {
            console.log(this.$el.children);
        }
    }
</script>
image.png
<script>
    export default {
        name: "button-group",
        mounted() {
            for(let node of this.$el.children){
                console.log(node);
            }
        }
    }
</script>
image.png
<script>
    export default {
        name: "button-group",
        mounted() {
            for (let node of this.$el.children) {
                if (node.nodeName !== 'button') {
                    console.warn('g-button-group的子元素应该都是button')
                }
            }
        }
    }
</script>

弹出警告

image.png

修改一下

<script>
    export default {
        name: "button-group",
        mounted() {
            for (let node of this.$el.children) {
                let name = node.nodeName.toLocaleLowerCase();
                if (name !== 'button') {
                    console.warn(`g-button-group的子元素应该都是button,但是你写的是 ${name}`)
                }
            }
        }
    }
</script>
image.png

相关文章

网友评论

      本文标题:3.vue造轮子-button-group

      本文链接:https://www.haomeiwen.com/subject/slgtlctx.html