vant 时间范围选择器封装

<template>
  <div class="edit-time-picker">
    <van-popup v-model="showPicker" round position="bottom">
      <van-picker
        v-show="step === 1"
        ref="picker"
        show-toolbar
        :columns="columns"
        @cancel="showPicker = false"
        @confirm="step = 2"
        confirm-button-text="下一步"
      />
      <van-picker
        v-show="step === 2"
        ref="secondPicker"
        show-toolbar
        :columns="columns"
        @cancel="step = 1"
        @confirm="onConfirm"
        cancel-button-text="上一步"
        confirm-button-text="确认"
      />
    </van-popup>
  </div>
</template>

<script>
import { Picker, Popup } from 'vant';

Vue.use(Picker).use(Popup);
export default {
  data() {
    return {
      showPicker: false,
      columns: [],
      step: 1
    }
  },
  created() {
    this.initColumns()
  },
  methods: {
    initColumns() {
      const list = []
      const Hours = []
      const Minutes = []
      const Seconds = []
      for (let i = 0; i<=23; i++) {
        Hours.push(String(i).padStart(2, '0'))
      }
      for (let i = 0; i<=59; i++) {
        Minutes.push(String(i).padStart(2, '0'))
        Seconds.push(String(i).padStart(2, '0'))
      }
      list.push({
        values: Hours,
        defaultIndex: 0
      })
      list.push({
        values: Minutes,
        defaultIndex: 0
      })
      list.push({
        values: Seconds,
        defaultIndex: 0
      })
      this.columns = list
    },
    open(times) {
      this.showPicker = true
      console.log('times', times)
      // 设置当前选中时间 19:23:33 格式
      if(times && times.length === 2) {
        const initialTime = times[0].split(':')
        if(initialTime.length === 3) {
          this.$nextTick(() => {
            this.$refs.picker && this.$refs.picker.setIndexes([Number(initialTime[0]), Number(initialTime[1]), Number(initialTime[2])])
          })
        }
        const initialTime2 = times[1].split(':')
        if(initialTime2.length === 3) {
          this.$nextTick(() => {
            this.$refs.secondPicker && this.$refs.secondPicker.setIndexes([Number(initialTime2[0]), Number(initialTime2[1]), Number(initialTime2[2])])
          })
        }
      } else {
        // 当前时间
        const date = new Date();
        let hours = String(date.getHours()).padStart(2, '0') // 时
        let minutes = String(date.getMinutes()).padStart(2, '0') // 分
        let seconds = String(date.getSeconds()).padStart(2, '0') //秒
        this.$nextTick(() => {
          this.$refs.picker && this.$refs.picker.setIndexes([Number(hours), Number(minutes), Number(seconds)])
          this.$refs.secondPicker && this.$refs.secondPicker.setIndexes([Number(hours), Number(minutes), Number(seconds)])
        })
      }
    },
    // 下一步
    nextStep() {
      this.step = 2
    },
    // 如果time2大于time1 返回true 否则 返回false
  compareTime(time1,time2) {
      if(this.time_to_sec(time2)- this.time_to_sec(time1)>0){
          return true;
      }
      return false;
   },
  //将时分秒转为时间戳
   time_to_sec(time) {
      if (time !== null) {
          var s = "";
          var hour = time.split(":")[0];
          var min = time.split(":")[1];
          var sec = time.split(":")[2];
          s = Number(hour * 3600) + Number(min * 60) + Number(sec);
          return s;
      }
    },
    onConfirm() {
      const firstValues = this.$refs.picker.getValues()
      const secondValues = this.$refs.secondPicker.getValues()
      const time1 = firstValues.join(':')
      const time2 = secondValues.join(':')
      // 判断结束时间大于开始时间
      const validTime = this.compareTime(time1, time2)
      if(!validTime) return this.$toast('开始时间设置不能大于结束时间')
      this.showPicker = false
      this.step = 1
      this.$emit('confirm', [time1, time2])
    }
  },
}
</script>

<style lang="less" scoped>
  .edit-time-picker {
    /deep/.van-picker__confirm {
      color: #0056FF;
    }
  }
</style>
// 使用方式
<time-range-picker ref="timeRangePicker"  @confirm="confirmTimeRangePicker" />
this.$refs.timeRangePicker.open(['12:23:24', '15:12:33'])
 
posted @ 2023-02-26 18:31  吃饭七分饱  阅读(479)  评论(0编辑  收藏  举报