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