<template> <view class="dropdown-list-wapper u-flex u-flex-1"> <view v-for="(drop, index) in dropdownListFromFather" :key="drop.name" :show="drop.show" class="u-selected-class u-dropdown-list" :style="{ zIndex: zIndex + 1 }" > <slot name="selectionbox"> <view :style="{ height: top + 'rpx' }" class="drop-item u-flex u-justify-center" @click="handleDropClick(drop)" > <text :style="{ color: drop.show ? activeColor : '#999' }"> {{ getTitle(drop.options) }} </text> <view class="u-animation" :class="[drop.show ? 'u-animation-show' : '']" > <u-icon v-if="drop.show" name="arrow-up-fill" :size="18" :color="activeColor" ></u-icon> <u-icon v-else name="arrow-down-fill" :size="18"></u-icon> </view> </view> </slot> <view class="u-dropdown-view" :class="[drop.show ? 'u-dropdownlist-show' : '']" :style="{ background: bgcolor, height: drop.show ? 'auto' : 0, top: top + 'rpx' }" > <slot name="dropdownbox"> <view class="u-selected-list"> <view class="select-item u-flex u-align-center u-border-bottom u-align-between" :style="{ color: select.select ? activeColor : '#666666' }" @tap="handleSelected(select, drop.options)" v-for="(select, n) in drop.options" :key="n" > <text>{{ select.text }}</text> <u-icon v-if="select.select" class="select-icon" :color="activeColor" size="35" name="checkmark" ></u-icon> </view> </view> </slot> </view> </view> <u-mask duration="100" :show="dropdownShow" @click="closeMask" :z-index="zIndex" ></u-mask> </view> </template> <script> const dropdownOption1 = [ { id: 0, text: '类型', value: '', select: false }, { id: 1, text: '全场券', value: 1, select: false }, { id: 2, text: '品类券', value: 2, select: false }, { id: 3, text: '单品券', value: 3, select: false }, { id: 4, text: '业务券', value: 4, select: false } ] const dropdownOption2 = [ { id: 5, text: '状态', value: '', select: false }, { id: 6, text: '可使用', value: 1, select: false }, { id: 7, text: '已过期', value: 2, select: false } ] const dropdownOption3 = [ { id: 8, text: '优惠力度', value: '', select: false }, { id: 9, text: '满100-20', value: 1, select: false }, { id: 10, text: '满100-50', value: 2, select: false } ] export default { props: { // 下拉框数据 dropdownList: { type: Array, default: () => [ { show: false, options: dropdownOption1 }, { show: false, options: dropdownOption2 }, { show: false, options: dropdownOption3 } ], required: true, validator: value => value.every(item => Array.isArray(item.options) && item.options.length) }, //背景颜色 bgcolor: { type: String, default: 'none' }, //top rpx 选择框高度也用这个值 top: { type: Number, default: 90 }, // 菜单标题和选项的选中态颜色 activeColor: { type: String, default: '#e7141a' }, // mask和下拉列表的z-index zIndex: { type: [String, Number], default: 21 } }, data() { return { dropdownShow: false, dropdownListFromFather: this.dropdownList } }, computed: {}, methods: { getTitle(item = []) { const obj = item.find(v => v.select) || {} if (obj.select) { return obj.text } else { if (item[0]) { item[0].select = true return item[0].text } } return '' }, handleDropClick(item) { if (item.show) { item.show = false this.dropdownShow = false return } this.dropdownListFromFather.map(item => { item.show = false }) const t = setTimeout(() => { item.show = true this.dropdownShow = true clearTimeout(t) }, 100) }, closeMask() { this.dropdownShow = false this.dropdownListFromFather.map(item => { item.show = false }) }, handleSelected(select, options) { options.map(item => { item.select = false }) select.select = true this.closeMask() // 返回选中对象和下拉列表数组 this.$emit('change', select, options) } }, watch: { dropdownList: { handler(v) { this.dropdownListFromFather = v }, deep: true } } } </script> <style lang="scss" scoped> @import "../../libs/css/style.components.scss"; .dropdown-list-wapper { position: relative; } .u-dropdown-view { width: 100%; overflow: hidden; position: absolute; z-index: 9999; left: 0; right: 0; /* opacity: 0; */ visibility: hidden; transition: height 0.5s ease-in-out; .u-selected-list { background-color: #fff; .select-item { color: #666666; font-size: 28rpx; padding: 30rpx 54rpx 30rpx 30rpx; margin-left: 30rpx; } .select-item.selectActive { color: #e7141a; } } } .u-dropdownlist-show { /* opacity: 1; */ visibility: visible; } .u-dropdown-list { flex: 1; // z-index: 22; background: #fff; position: static; } .drop-item { justify-content: center; color: #999999; font-size: 30rpx; > text { margin-right: 10rpx; } /deep/ { .uicon { position: relative; top: -2rpx; } } } </style>