vue-时间插件,效果见图

<template>
  <div class="select-time-wrapper">
    <h5 class="titie">选择自提时间</h5>
    <div class="select-time-content flex">
      <ul class="days">
        <li
          v-for="(item, i) in days"
          :key="i"
          class="select-day"
          :class="{ current: currentDay === i }"
          @click="currentDay = i"
        >
          {{ item }}
        </li>
      </ul>
      <ul class="time-range">
        <li
          v-for="(item, i) in displayTimeRange"
          :key="i"
          class="select-time"
          @click="handleTimeClick(i)"
        >
          <span class="txt">{{ item }}</span>
          <i class="icon"></i>
        </li>
      </ul>
    </div>
  </div>
</template>

<script>
import dayjs from 'dayjs';

const checkNum = num => (num < 10 ? `0${num}` : String(num));
const suffixZero = str => `${str}:00`;
const translateToDays = {
  0: '周日',
  1: '周一',
  2: '周二',
  3: '周三',
  4: '周四',
  5: '周五',
  6: '周六'
};
const defaultSelectedDay = 0;

export default {
  name: 'SelectTime',
  data() {
    const date = dayjs();
    const tomorrow = date.add(1, 'day');
    const theDayAfterTomorrow = date.add(2, 'day');
    const days = [
      `今日(${translateToDays[date.day()]})`,
      `明日(${translateToDays[tomorrow.day()]})`,
      `${theDayAfterTomorrow.format('M-DD')}(${
        translateToDays[theDayAfterTomorrow.day()]
      })`
    ];

    return {
      days,
      currentDay: defaultSelectedDay,
      initialArr: [],
      maxHour: 22,
      minHour: 9,
      selectedTime: ''
    };
  },
  computed: {
    displayTimeRange() {
      const { currentDay, initialArr, minHour, maxHour } = this;
      const currentHour = new Date().getHours();
      const sliceStart =
        currentHour < minHour || currentHour + 1 > maxHour
          ? 0
          : currentHour + 1 - minHour;

      return currentDay === defaultSelectedDay
        ? initialArr.slice(sliceStart)
        : [...initialArr];
    }
  },
  created() {
    this.initialArr = this.generateArr();
  },
  methods: {
    generateArr() {
      const { minHour, maxHour } = this;
      var arr = [];
      for (let i = minHour; i < maxHour; i++) {
        arr.push(
          [suffixZero(checkNum(i)), '-', suffixZero(checkNum(i + 1))].join('')
        );
      }
      return arr;
    },
    handleTimeClick(i) {
      this.selectedTime = this.displayTimeRange[i];
    }
  }
};
</script>

<style lang="scss" scoped>
.select-time-wrapper {
  .titie {
    padding: 10px;
    text-align: center;
  }
  .select-time-content {
    display: flex;

    .days {
       120px;
      background-color: #ddd;
      text-align: center;
    }
    .time-range {
      flex: 1;
      height: 200px;
      overflow-y: scroll;
      -webkit-overflow-scrolling: smooth;
    }
    .select-day,
    .select-time {
      cursor: pointer;
    }
    .select-day {
      &.current {
        background-color: #fff;
      }
    }
  }
}
</style>

  

原文地址:https://www.cnblogs.com/ilovexiaoming/p/11174910.html