<template>
|
|
<view class="drop-down">
|
|
<button class="btn-simple" plain @click="openPicker" >
|
|
<slot>
|
|
<image src="../../static/image/record/filter.png" style="width: 30rpx; height: 30rpx; margin: 10rpx;"></image>
|
|
</slot>
|
|
</button>
|
|
|
|
<template v-if="popupVisible">
|
|
<view class="drop-down-overlay" @click="closePicker"></view>
|
|
|
|
<view class="card drop-down-popup">
|
|
<view
|
|
v-for="item in options"
|
|
class="drop-down-option"
|
|
:class="[item.value === value ? 'is-active' : '']"
|
|
:key="item.value"
|
|
@click="onSelect(item.value)"
|
|
>
|
|
<text>{{ item.label }}</text>
|
|
</view>
|
|
</view>
|
|
</template>
|
|
</view>
|
|
</template>
|
|
|
|
|
|
<script>
|
|
export default {
|
|
props: {
|
|
value: {
|
|
type: String | Number,
|
|
default: null,
|
|
},
|
|
options: {
|
|
type: Array,
|
|
default() {
|
|
return []
|
|
}
|
|
}
|
|
},
|
|
data() {
|
|
return {
|
|
popupVisible: false,
|
|
}
|
|
},
|
|
methods: {
|
|
openPicker() {
|
|
this.popupVisible = true
|
|
},
|
|
closePicker() {
|
|
this.popupVisible = false
|
|
},
|
|
onSelect(val) {
|
|
const selected = this.value
|
|
const newVal = selected === val ? null : val
|
|
|
|
this.$emit('input', newVal)
|
|
this.$emit('change', newVal)
|
|
},
|
|
},
|
|
}
|
|
</script>
|
|
|
|
<style scoped lang="scss">
|
|
.drop-down {
|
|
position: relative;
|
|
clear: both;
|
|
|
|
&-overlay {
|
|
position: fixed;
|
|
width: 100vw;
|
|
height: calc(100vh - #{$navbar-height} - var(--status-bar-height) - 20rpx);
|
|
background: transparent;
|
|
bottom: 0;
|
|
left: 0;
|
|
font-size: 0;
|
|
}
|
|
|
|
&-popup {
|
|
box-shadow: 0 2px 12px 0 rgba(0,0,0,.1);
|
|
padding: 16rpx 40rpx;
|
|
position: absolute;
|
|
z-index: 99;
|
|
right: -14rpx;
|
|
margin-top: 28rpx;
|
|
|
|
&:before {
|
|
content: ' ';
|
|
position: absolute;
|
|
top: -28rpx;
|
|
right: 14rpx;
|
|
width: 0;
|
|
height: 0;
|
|
border: 14rpx solid transparent;
|
|
border-bottom-color: #FFFFFF;
|
|
}
|
|
|
|
}
|
|
|
|
&-option {
|
|
color: #999999;
|
|
font-size: 28rpx;
|
|
|
|
white-space: nowrap;
|
|
|
|
&.is-active {
|
|
color: #1B1B1B;
|
|
font-weight: 700;
|
|
}
|
|
|
|
& + & {
|
|
margin-top: 16rpx;
|
|
}
|
|
}
|
|
}
|
|
</style>
|