<template> <view> <view class="drop-title">{{dropObj.title}}</view> <view class="drop-box display-between-center" @tap="tuneUpEv"> <view>{{activeText}}</view> <i class="icon icon-next colpeili flexs" style="transition: all .3s;" :style="{transform: `rotate(${showFrame ? '0' : '90'}deg)`}"></i> <view v-if="showFrame" class="drop animated " :class="showFrame?'fadeIn':'fadeOut'"> <view class="item-title" :class="activeItem==index?'itemActive':'itemMo'" @tap.stop="chooseItem(index,item.id,item.title,dropObj.title)" v-for="(item,index) in dropObj.children" :key="index"> <view class="clips1">{{item.title}}</view> </view> </view> </view> </view> </template> <script> export default { name:"drop-down", props:{ dropObj:{ type:Object, default:()=>{ return { title:'颜色', children:[ { id:1, childrenTitle:'粉色' }, { id:1, childrenTitle:'蓝色' } ] } } } }, data() { return { showFrame:false, // 是否显示下拉框 activeText:'', // 选中的标题 activeItem:-1 // 选中的下标 }; }, mounted() { if(this.dropObj.children.length){ this.activeText = `请选择${this.dropObj.title}`; } else { this.activeText = `暂无可选项`; } }, methods:{ // 选择事件 chooseItem(index,id,title,mainTitle){ // 选中的下标 this.activeItem = index; // 选中的标题 this.activeText = title; // 隐藏弹框 this.showFrame = false; this.$emit('chooseItem',{id:id,title:title,mainTitle:mainTitle}) }, // 调起选择弹框 tuneUpEv(){ if(this.activeText!=`暂无可选项`){ this.showFrame = !this.showFrame; } } } } </script> <style scoped> .drop-title{font-size: 30rpx;color: #000000;} .display-between-center{display: flex;justify-content: space-between;align-items: center;} .drop-box{position: relative; border: 1rpx solid #8c8c9b;padding: 20rpx;box-sizing: border-box;margin: 20rpx 0;font-size: 24rpx;color: #000000;} .drop{ position: absolute;top:39px;left: -1rpx;right: -1rpx;z-index: 2; max-height: 280rpx; overflow: hidden; overflow-y: scroll; border: 1rpx solid #8c8c9b; background-color: #FFFFFF; } .itemActive{background-color: #000000;color: #FFFFFF;} .itemMo{background-color: #FFFFFF;color: #000000;} .item-title{padding: 20rpx;} </style>