| <template> | |
|   <view class="flex option" :style="style"> | |
|     <view  | |
|       :class="['option-item', item.id === selected ? 'is-active' : '']"  | |
|       v-for="item in options"  | |
|       :key="item.id" | |
|       @click="selected = item.id" | |
|     > | |
|       <view class="option-item-content"> | |
|         <view class="flex time"> | |
|           <view class="time-val">{{ $dayjs(item.startDate).format('MM/DD') }}</view> | |
|           <view class="time-split">-</view> | |
|           <view class="time-val">{{ $dayjs(item.endDate).format('MM/DD') }}</view> | |
|         </view> | |
|         <view class="flex price"> | |
|           <view class="price-val"> | |
|             <text>¥</text> | |
|             <text class="highlight">{{ priceInt(item.priceDiscount) }}</text> | |
|             <text>{{ `${priceFrac(item.priceDiscount)}起` }}</text> | |
|           </view> | |
|           <view class="price-bef" v-if="item.priceOrigin">¥<text>{{ item.priceOrigin }}</text></view> | |
|         </view> | |
|       </view> | |
|       <view class="flex option-item-bottom"> | |
|         {{ item.id === selected ? '已选择' : '点击选择' }} | |
|       </view> | |
|     </view> | |
|   </view> | |
| </template> | |
|  | |
| <script> | |
|   export default { | |
|     props: { | |
|       value: { | |
|         type: String | Number, | |
|         default: null | |
|       }, | |
|       options: { | |
|         type: Array, | |
|         default() { | |
|           return [] | |
|         } | |
|       }, | |
|       style: { | |
|         type: String, | |
|         default: '' | |
|       }, | |
|     }, | |
|     computed: { | |
|       selected: { | |
|         set(val) { | |
|           this.$emit('input', val) | |
|         }, | |
|         get() { | |
|           return this.value | |
|         } | |
|       }, | |
|     }, | |
|     methods: { | |
|       priceInt(priceDiscount) { | |
|         return Math.floor(priceDiscount) | |
|       }, | |
|       priceFrac(priceDiscount) { | |
|         let frac = priceDiscount % this.priceInt(priceDiscount) | |
|         return frac > 0 ? frac.toFixed(2).slice(1) : '' | |
|       }, | |
|     }, | |
|   } | |
| </script> | |
|  | |
| <style scoped lang="scss"> | |
| 
 | |
|   .option { | |
|     width: 100%; | |
|     overflow-x: auto; | |
|     flex-wrap: nowrap; | |
|     justify-content: flex-start; | |
|     column-gap: 16rpx; | |
| 
 | |
|     &-item { | |
|       min-width: 238rpx; | |
|       flex: none; | |
|       font-size: 0; | |
|       border: 2rpx solid #EEEEEE; | |
|       border-radius: 12rpx; | |
|       overflow: hidden; | |
| 
 | |
|       &-content { | |
|         padding: 16rpx 12rpx; | |
|       } | |
| 
 | |
|       &-bottom { | |
|         padding: 12rpx 0; | |
|         font-size: 28rpx; | |
|         font-weight: 500; | |
|         color: #191919; | |
|         background: #E4E7EB; | |
|       } | |
| 
 | |
|       &.is-active { | |
|         background: #E9F8FF; | |
|         border-color: #00A9FF; | |
| 
 | |
|         .option-item-bottom { | |
|           color: #FFFFFF; | |
|           background: #00A9FF; | |
|         } | |
|       } | |
|     } | |
|   } | |
| 
 | |
|   .time { | |
|     column-gap: 8rpx; | |
| 
 | |
|     &-val { | |
|       font-size: 28rpx; | |
|       font-weight: 500; | |
|       color: #000000; | |
|     } | |
| 
 | |
|     &-split { | |
|       font-size: 24rpx; | |
|       color: #8B8B8B; | |
|     } | |
|   } | |
| 
 | |
|   .price { | |
|     margin-top: 4rpx; | |
|     align-items: baseline; | |
|     column-gap: 8rpx; | |
|     white-space: nowrap; | |
| 
 | |
|     &-val { | |
|       font-size: 24rpx; | |
|       font-weight: 500; | |
|       color: #FF4800; | |
| 
 | |
|       .highlight { | |
|         font-size: 32rpx; | |
|       } | |
|     } | |
| 
 | |
|     &-bef { | |
|       text-decoration: line-through; | |
|       font-size: 24rpx; | |
|       color: #8B8B8B; | |
|     } | |
|   } | |
|    | |
| </style> |