使用Vant 二次封装一个时间选择器(DateTimePicker)

在vant 中 dateTimePicker 和 popup 是分开的,如果想实现一个完整的时间选择器,必须要要对piker和popup进行重新封装,vs-date-picker是对它们的一个简单的二次封装。可根据自己的需要随意增删。

- vs-date-picker API

在这里插入图片描述

- vs-date-picker 使用代码演示

 <van-cell title='选择时间' :value='dateTxt' is-link @click='openPicker' />
 <VsDatePicker
      v-model='show'
      type='year-month'
      :currentDate='currentDate'
      @change='changeData' />
<script>
import VsDatePicker from '../../components/weight/vsDatePicker'
import { parseTime } from '../../utils'

export default {
  name: 'DatePickerPage',
  components: {
    VsDatePicker
  },
  data() {
    return {
      show: false,
      currentDate: ''
    }
  },
  computed: {
    dateTxt: function() {
      return this.currentDate
        ? parseTime(this.currentDate, '{y}-{m}')
        : this.currentDate
    }
  },
  methods: {
    openPicker() {
      this.show = true
    },
    changeData(val) {
      this.currentDate = val
    }
  }
}
</script>

- vs-date-picker 组件源码

新建一个名有 vs-date-picker.vue文件,代码如下:

<template>
  <!--  van-poppup 使用:value的绑定形式为了防止在click-overlay的时候出现修改子组件修改prop值出现的报错问题 -->
  <van-popup :value='value' position='bottom' @click-overlay='chosePiker'>
    <van-datetime-picker
      ref='picker'
      v-model='choiceTime'
      :type='$attrs.type'
      :title='$attrs.title'
      :min-date='minMaxDate[0]'
      :max-date='minMaxDate[1]'
      :formatter='formatter'
      @confirm='changeDate'
      @cancel='chosePiker'
    />
  </van-popup>
</template>

<script>
export default {
  name: 'DatePicker',
  props: {
    value: {
      type: Boolean,
      default: false
    },
    // 可选择的时间范围 1:不指定默认:2002/5-至今 2:只指定开始时间:开始时间-至今 3:自定义
    timeRange: {
      type: Array,
      default: () => []
    }
  },
  data() {
    return {
      choiceTime: ''
    }
  },
  computed: {
    minMaxDate: function() {
      // Vant with minDate and maxDate must date type
      let { timeRange } = this

      if (timeRange.length) {
        if (!timeRange[1]) timeRange[1] = new Date()

        timeRange[0] = timeRange[0] instanceof Date ? timeRange[0] : new Date(timeRange[0].replace(/-/g, '/'))
        timeRange[1] = timeRange[1] instanceof Date ? timeRange[1] : new Date(timeRange[1].replace(/-/g, '/'))

        if (isNaN(timeRange[0].getTime()) || isNaN(timeRange[1].getTime())) throw new Error('timeRange时间格式错误!')
      } else {
        timeRange = [new Date('2002-05'), new Date()]
      }

      return timeRange
    }
  },
  created() {
    this.choiceTime = this.$attrs.currentDate
  },
  methods: {
    formatter(type, val) {
      if (type === 'year') {
        return `${val}`
      } else if (type === 'month') {
        return `${val}`
      } else if (type === 'day') {
        return `${val}`
      } else if (type === 'hour') {
        return `${val}`
      } else if (type === 'minute') {
        return `${val}`
      }
      return val
    },
    changeDate(val) {
      this.$emit('input', false)
      this.$emit('change', val)
    },
    chosePiker() {
      this.choiceTime = this.$attrs.currentDate
      setTimeout(() => {
        this.$emit('input', false)
      }, 0)
    }
  }
}
</script>

<style scoped>

</style>
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值