封装下拉框组件

子组件

<template>
    <div class="dropDown" @mouseover="onDplOver($event)" @mouseout="onDplOut($event)">
        <span class="selected" v-text="selectItem"></span> 
        <ul class="options">
            <li @click="onLiClick(item, $event)" v-for="(item,index) in selectItems" :key="item[value]" v-text="item.name" :class="{'bor':clicked == index}">             
            </li>           
        </ul>
    </div>
</template>
<script>
export default {
    props:{
        name: {
            type: String,
            default: "name"
        },
        value: {
            type: String,
            default: "value"
        },
        selectItems:{
            type:Array,
            required:false,
            default(){
                return [
                    {name: "选项一"},
                    {name: "选项二"}
                ]
            }
        },
        selectedItem: {
            type: Object,
            required: false
        },
        placeholder: {
            type: String,
            default: '请选择'
        },
        unit: {
            type: String,
            default: ""
        }
    },
   data(){
       return{
          activeIndex:0,
          clicked:this.selectedItem.value
       }
   },
   computed:{
       //计算属性,selectItem为选中的值
        selectItem(){
            // debugger;
            // return this.selectItems[this.activeIndex].name          
            return this.selectedItem[this.name] ? this.selectedItem[this.name] + this.unit : this.placeholder;          
        }
   },
   methods:{
        //鼠标滑过时,设置ul显示
       onDplOver(event){
            let ul = event.currentTarget.childNodes[1];
            ul.style.display = "block";
        },
        // 鼠标滑出时,ul隐藏
        onDplOut(event){
            let ul = event.currentTarget.childNodes[1];
            ul.style.display = "none";
        },
        onLiClick(index){
            // debugger;
            // 需要获取事件冒泡的所有元素,path是数组
            // this.clicked = index;  
            // let path = event.path || (event.composedPath && event.composedPath()) //兼容火狐和safari
            // path[1].style.display = "none";
            // this.activeIndex = index;  
            // this.selectedItem[this.name] = this.selectItems[index].name;
            // debugger
            // console.log('选中项',this.selectedItem[this.name])
            // this.selectedItem = index;
            // 向父组件发送值
            // this.$emit("change", {
            //     index:index,
            //     value:this.selectItems[index]
            // })
            this.$emit('update:selectedItem',  index)
        }
   },
   
}
</script>
<style lang="less" scoped>
.dropDown{
    .selected{
        width: 120px;
        height: 27px;
        display: inline-block;
        vertical-align: middle;
        border: 1px solid #333;
        border-radius: 4px;
        text-align: center;
        font-size: 14px;
        line-height: 27px;
    }
    .options{
        padding: 0;
        margin: 0;
        width: 120px;
        border: 1px solid #333;
        border-radius: 4px;
        display: none;

        li{
            width: 100%;
            height: 27px;
            text-align: center;
            padding: 0;
            cursor: pointer;

            &:hover{
               background: #ededed;
            }
            
        }

        .bor{
            border: 1px solid blue;
            border-radius: 4px;
        }
    }
}
</style>


父组件

<dropDown :selectItems='selectItems' :name="'name'" :value="'value'" :selectedItem.sync="selectedcategory"></dropDown>
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值