|
|
- <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>
|