前端:每天一个工作小技巧 如何实现一个前端的选中效果(Vue3 + Element ui)

52e31afb2d3194fa11c36fa3d2bf5408.gif

前言

大家好 我是歌谣 今天继续给大家带来平时工作生活中 会遇到的一些开发需求 
今天要说的需求就是实现一个需求 在选中的时候按钮的样式会发生变化

80e216420573bf66684cccfa40effc03.gif

a4bcf3dffa2eb365156d36e96d35dea8.gif

思路

 fee06d1adc12886281c344464f940450.gif

首先 遇到这样的需求 我们所需要做的就是要分析 
先简单画出我们所需要的样式 这是我们设计需求的第一步

b9d12313b090850c434d4c0cb5426a1a.png

3841b46f1579800e59ed35806a09717e.gif

效果

实现点击的时候右侧的颜色选中会改变左侧的页面效果 这就是我们所需要的

476dcc3a4dd73d1b1ece5279c53cc93d.gif

页面部分

<template>
    <div  class="GeyaoColor">
        <div class="GeyaoColorContent">
            <div :style="`color:${activeColor}`"  class="GeyaoColorLeft">前端小歌谣</div>
            <div class="GeyaoColorMiddle"></div>
            <div class="GeyaoColorRight">
                <div :style="`background-color:${item}`"  :span="6" v-for="(item, index) in defaultValueColor" @click="handleColor(item)"
                    :class="`${item === activeColor? 'GeyaoColorActive' : 'GeyaoColorTag'} `">
                </div>
            </div>
        </div>
    </div>
</template>

be86acdf0cb041533f1342f8f0baa0f3.gif

逻辑部分

<script setup>
import { ref, defineProps,defineEmits,defineExpose,watch} from "vue"
const props = defineProps({
    modelValue: {
        type: String,
        required: ()=>''
    },
    defaultColor: {
        type: Array,
        default: () => []
    },
})
const defaultValueColor = ref(props?.defaultColor)
const emit = defineEmits(['update:modelValue'])
const activeColor = ref(props?.modelValue)
const handleColor = (item) => {
    activeColor.value = item
}


defineExpose({
    activeColor
})
</script>

c78726a89968e8273235ebe16170b836.gif

样式部分

<style lang="scss" scoped>
.GeyaoColor {
    width: 417px;
    height: 112px;
    background: #FAFAFA;
    border-radius: 8px 8px 8px 8px;


    .GeyaoColorContent {
        display: flex;
        align-items: center;




        .GeyaoColorLeft {
            width: 241px;
            height: 64px;
            line-height: 64px;
            border-radius: 0px 0px 0px 0px;
            margin-top: 28px;
            display: flex;
            justify-content: center;


        }


        .GeyaoColorMiddle {
            width: 1px;
            height: 64px;
            border: 1px solid #E6E9F0;
            margin-top: 28px;
        }


        .GeyaoColorRight {
            width: 176px;
            height: 56px;
            border-radius: 0px 0px 0px 0px;
            margin-top: 28px;
            display: flex;
            flex-wrap: wrap;


            .GeyaoColorTag {
                width: 20px;
                height: 20px;
                margin: 0 0 0 16px;
                border-radius: 4px 4px 4px 4px;
            }


            .GeyaoColorActive {
                width: 28px;
                height: 28px;
                margin: 0 0 0 16px;
                border-radius: 8px 8px 8px 8px;
                border: 1px solid #246AE3;
            }
        }
    }
}
</style>

3353e70444b933f338f2b9f7d5af281e.gif

子组件

<template>
    <div  class="GeyaoColor">
        <div class="GeyaoColorContent">
            <div :style="`color:${activeColor}`"  class="GeyaoColorLeft">前端小歌谣</div>
            <div class="GeyaoColorMiddle"></div>
            <div class="GeyaoColorRight">
                <div :style="`background-color:${item}`"  :span="6" v-for="(item, index) in defaultValueColor" @click="handleColor(item)"
                    :class="`${item === activeColor? 'GeyaoColorActive' : 'GeyaoColorTag'} `">
                </div>
            </div>
        </div>
    </div>
</template>
<script setup>
import { ref, defineProps,defineEmits,defineExpose,watch} from "vue"
const props = defineProps({
    modelValue: {
        type: String,
        required: ()=>''
    },
    defaultColor: {
        type: Array,
        default: () => []
    },
})
const defaultValueColor = ref(props?.defaultColor)
const emit = defineEmits(['update:modelValue'])
const activeColor = ref(props?.modelValue)
const handleColor = (item) => {
    activeColor.value = item
}


defineExpose({
    activeColor
})
</script>
<style lang="scss" scoped>
.GeyaoColor {
    width: 417px;
    height: 112px;
    background: #FAFAFA;
    border-radius: 8px 8px 8px 8px;


    .GeyaoColorContent {
        display: flex;
        align-items: center;




        .GeyaoColorLeft {
            width: 241px;
            height: 64px;
            line-height: 64px;
            border-radius: 0px 0px 0px 0px;
            margin-top: 28px;
            display: flex;
            justify-content: center;


        }


        .GeyaoColorMiddle {
            width: 1px;
            height: 64px;
            border: 1px solid #E6E9F0;
            margin-top: 28px;
        }


        .GeyaoColorRight {
            width: 176px;
            height: 56px;
            border-radius: 0px 0px 0px 0px;
            margin-top: 28px;
            display: flex;
            flex-wrap: wrap;


            .GeyaoColorTag {
                width: 20px;
                height: 20px;
                margin: 0 0 0 16px;
                border-radius: 4px 4px 4px 4px;
            }


            .GeyaoColorActive {
                width: 28px;
                height: 28px;
                margin: 0 0 0 16px;
                border-radius: 8px 8px 8px 8px;
                border: 1px solid #246AE3;
            }
        }
    }
}
</style>

0d12f474900e3afdac93ec673579f85b.gif

父组件

<SelectTag :defaultColor="defaultValue"></SelectTag>
const defaultValue = ["#FFB6D1", "#DC163C", "#87CEFA", 
"#40E0D0", "#FFD700", "#FF4500", "#A9A9A9", "#FFE4E1"]

fc659ff8c5967fe856f6e4aeef9ac98d.gif

运行

cf013821c60c63259bdbaf3e12ff7a8f.png

outside_default.png

点击上方蓝字关注我们

outside_default.png

c8bc2d06aad61a3239a9724301b5c22e.png

下方查看历史文章

288a6c71cd63d711341e24faf6fa42f9.png

前端:每天一个工作小技巧 如何去封装一个弹框组件(Vue3+element plus)

前端:每天一个前端工作常见技巧前端如何根据数据进行手动分页(Vue3 + elementplus)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值