移动端 van-datetime-picker 组件不支持选择秒,自己写组件支持选择 “年月日时分秒”

需求

使用 van-datetime-picker 组件写时间选择时,不支持选择 “秒” 在这里插入图片描述

要求能够选择精确到秒

代码

封装组件 TimePicker

<template>
  <div>
    <!-- 弹出层 -->
    <van-popup get-container="body" v-model="isPicker" position="bottom" @close="confirmOn">
      <!-- 时间选择 -->
      <van-picker
        ref="pickerRef"
        show-toolbar
        title="请选择时间"
        :columns="columns"
        @change="onChange"
        @cancel="cancelOn"
        @confirm="onConfirm"
      />
    </van-popup>
  </div>
</template>

<script>
import _ from 'lodash.clonedeep'
const currentYear = new Date().getFullYear()
const currentMonth = new Date().getMonth() + 1
const currentDate = new Date().getDate()
const currentHour = new Date().getHours()
const currentMinute = new Date().getMinutes()
const currentSecond = new Date().getSeconds()

export default {
      
      
  name: 'TimePicker',
  props: ['showPicker', 'values', 'maxDate'],
  data() {
      
      
    return {
      
      
      isPicker: false, // 是否显示弹出层
      columns: [], // 所有时间
      Mdays: '', // 弹窗关闭时月份所在值
      Dindex: null
    }
  },
  watch: {
      
      
    isPicker(val) {
      
      
      !val && this.$emit('changeValue')
      this.columns = []
      this.getcolumns()
    },
    showPicker(val) {
      
      
      this.isPicker = val
    },
    values(val) {
      
      
      if (val === '') {
      
      
        this.Mdays = ''
        this.Dindex = null
      }
    }
  },
  methods: {
      
      
    getCountDays(year, month) {
      
      
      // 获取某年某月多少天
      var day = new Date(year, month, 0)
      return day.getDate()
    },
    getcolumns() {
      
      
      var strtime = this.values
      console.log('strtime----', strtime)
      var date = new Date(strtime)
      var vmoduletime = date.getTime()
      var vmoduledate = null
      if (this.values !== '') {
      
      
        vmoduledate = new Date(vmoduletime)
      } else {
      
      
        vmoduledate = new Date() // 没有传入时间则默认当前时刻
      }
      var Y = vmoduledate.getFullYear()
      var M = vmoduledate.getMonth()
      var D = vmoduledate.getDate()
      var h = vmoduledate.getHours()
      var m = vmoduledate.getMinutes()
      var s = vmoduledate.getSeconds()
      /** ** 获取最大可选时间前十年数组 ****/
      var year = {
      
      }
      year.values = []
      var Currentday = this.maxDate.getFullYear()
      for (var i = Currentday - 10; i <= Currentday; i++) {
      
      
        year.values.push(i + '年')
      }
      year.defaultIndex = year.values.indexOf(Y + '年') // 设置默认选项当前年
      this.columns.push(year)

      /** ** 获取当前时间 “月” 数组 currentMonth ****/
      var month = {
      
      }
      month.defaultIndex = M
      month.values = Object.keys(Array.apply(null, {
      
       length: currentMonth + 1 })).map(item => {
      
      
        if (+item + 1 <= 10) {
      
      
          return '0' + item + '月'
        } else if (+item + 1 === 11) {
      
      
          return +item + '月'
        } else {
      
      
          return (+item + 0).toString() + '月'
        }
      })
      month.values.splice(0, 1)
      this.columns.push(month)

      /** ** 获取当前 “日” 数组 currentDate ****/
      var day = {
      
      }
      day.defaultIndex = this.Dindex === null ? D - 1 : this.Dindex
      day.values = Object.keys(Array.apply(null, {
      
       length: currentDate + 1 })).map(item => {
      
      
        if (+item + 1 <= 10) {
      
      
          return '0' + item + '日'
        } else if (+item + 1 === 11) {
      
      
          return +item + '日'
        } else {
      
      
          return (+item + 0).toString() + '日'
        }
      })
      day.values.splice(0, 1)
      this.columns.push(day)

      /** ** 获取当前 “时” 数组 currentHour ****/
      var hour = {
      
      } // 创建小时数组
      hour.defaultIndex = h
      hour.values = Object.keys(Array.apply(null, {
      
       length: currentHour + 1 })).map(item => {
      
      
        if (+item + 1 <= 10) {
      
      
          return '0' + item + '时'
        } else if (+item + 1 === 11) {
      
      
          return +item + '时'
        } else {
      
      
          return (+item + 0).toString() + '时'
        }
      })
      this.columns.push(hour)

      /** ** 获取当前 “分” 数组 currentMinute ****/
      var mi = {
      
      }
      mi.defaultIndex = m
      mi.values = Object.keys(Array.apply(null, {
      
       length: currentMinute + 1 })).map(item => {
      
      
        if (+item + 1 <= 10) {
      
      
          return '0' + item + '分'
        } else if (+item + 1 === 11) {
      
      
          return +item + '分'
        } else {
      
      
          return (+item + 0).toString() + '分'
        }
      })
      this.columns.push(mi)

      /** ** 获取当前 “秒” 数组 currentSecond ****/
      var ss = {
      
      }
      ss.defaultIndex = s
      ss.values = Object.keys(Array.apply(null, {
      
       length: currentSecond + 1 })).map(item => {
      
      
        if (+item + 1 <= 10) {
      
      
          return '0' + item + '秒'
        } else if (+item + 1 === 11) {
      
      
          return +item + '秒'
        } else {
      
      
          return (+item + 0).toString() + '秒'
        }
      })
      this.columns.push(ss)
    },
    onChange(values, a) {
      
      
      /** ** 判断是当前年 - 限制月最大只能是当前月 ****/
      if (a[0].indexOf(currentYear) !== -1) {
      
      
        console.log('"当前年"----', '当前年')
        this.resetHandler(a, currentMonth, 1, '月')
      } else {
      
      
        this.resetHandler(a, 12, 1, '月')
      }
      /** ** 判断是当前月 - 限制日最大只能是当前日 ****/
      if (a[0].indexOf(currentYear) !== -1 && a[1].indexOf(currentMonth) !== -1) {
      
      
        console.log('"当前月"----', '当前月')
        this.resetHandler(a, currentDate, 2, '日')
      } else {
      
      
        var days = this.getCountDays(currentYear, a[1].slice(0, 2))
        this.resetHandler(a, days, 2, '日')
      }
      /** ** 判断是当前日 - 限制时最大只能是当前时 ****/
      if (a[0].indexOf(currentYear) !== -1 && a[1].indexOf(currentMonth) !== -1 && a[2].indexOf(currentDate) !== -1) {
      
      
        console.log('"当前日"----', '当前日')
        this.resetHandler(a, currentHour, 3, '时')
      } else {
      
      
        this.resetHandler(a, 24, 3, '时')
      }
      /** ** 判断是当前时 - 限制分最大只能是当前分 ****/
      if (
        a[0].indexOf(currentYear) !== -1 &&
        a[1].indexOf(currentMonth) !== -1 &&
        a[2].indexOf(currentDate) !== -1 &&
        a[3].indexOf(currentHour) !== -1
      ) {
      
      
        console.log('"当前时"----', '当前时')
        this.resetHandler(a, currentMinute, 4, '分')
      } else {
      
      
        this.resetHandler(a, 59, 4, '分')
      }
      /** ** 判断是当前分 - 限制秒最大只能是当前秒 ****/
      if (
        a[0].indexOf(currentYear) !== -1 &&
        a[1].indexOf(currentMonth) !== -1 &&
        a[2].indexOf(currentDate) !== -1 &&
        a[3].indexOf(currentHour) !== -1 &&
        a[4].indexOf(currentMinute) !== -1
      ) {
      
      
        console.log('"当前分"----', '当前分')
        this.resetHandler(a, currentSecond, 5, '秒')
      } else {
      
      
        this.resetHandler(a, 59, 5, '秒')
      }
    },
    // 重新设置 月、日、时、分、秒
    resetHandler(currentTimeList, setLength, setIndex, unit) {
      
      
      var newData = {
      
      } // 获取 setLength 即将设置长度数组
      newData.values = Object.keys(Array.apply(null, {
      
       length: setLength + 1 })).map(item => {
      
      
        if (+item + 1 <= 10) {
      
      
          return '0' + item + unit
        } else if (+item + 1 === 11) {
      
      
          return +item + unit
        } else {
      
      
          return (+item + 0).toString() + unit
        }
      })
      newData.values.splice(0, 1)
      this.$refs.pickerRef.setColumnValues(setIndex, _(newData.values)) // 设置第 setIndex 列的值
      this.$refs.pickerRef.setColumnIndex(setIndex, currentTimeList[setIndex].substr(0, 2) - 1) // 设置第 setIndex 列索引
    },
    // 关闭弹框
    confirmOn() {
      
      
      var currentM = this.$refs.pickerRef.getColumnValue(1)
      this.Mdays = currentM.substr(0, 2)
      this.Dindex = this.$refs.pickerRef.getColumnIndex(2)
    },
    // 时间选择器关闭
    cancelOn() {
      
      
      this.$emit('changeValue')
    },
    // 时间选择器确定
    onConfirm(val, index) {
      
      
      var endval =
        val[0].substr(0, 4) +
        '-' +
        val[1].substr(0, 2) +
        '-' +
        val[2].substr(0, 2) +
        ' ' +
        val[3].substr(0, 2) +
        ':' +
        val[4].substr(0, 2) +
        ':' +
        val[5].substr(0, 2)
      this.$emit('changeValue', endval)
      this.$emit('confirm', endval)
    }
  }
}
</script>

组件使用

<template>
	<!-- <van-popup v-model="isShowTimePicker" position="bottom">
	  <van-datetime-picker
	    type="datetime"
	    title="选择时间"
	    v-model="datePickerCurrentTime"
	    :max-date="maxDate"
	    @confirm="onConfirmTime"
	    @cancel="isShowTimePicker = false"
	  />
	</van-popup> -->
	<timePicker
	  ref="popup"
	  :max-date="maxDate"
	  :values="datePickerCurrentTime"
	  :showPicker="isShowTimePicker"
	  @changeValue="isShowTimePicker = false"
	  @confirm="onConfirmTime"
	/>
</template>

<script>
export default {
      
      
  data() {
      
      
  	return {
      
      
	  maxDate: new Date(),
	  datePickerCurrentTime: new Date(), // 时间选择器当前选值,默认是当前时间
	  isShowTimePicker: false,
  	}
  },
  methods: {
      
      
    onConfirmTime(val) {
      
      
	  ...
	  this.isShowTimePicker = false
	},
  }
}
</script>

效果展示

在这里插入图片描述

参考:https://blog.csdn.net/shids_/article/details/129492814
自己改了下:限制最大可选择时间

猜你喜欢

转载自blog.csdn.net/m0_53562074/article/details/131661793