将日期以周的形式展示基于vue2和vant

 项目背景

        h5项目,基于vue2和vant

需求

        需要有周报形式的,滚轮选取日期组件,效果如上图

解决方案

        在vant组件库中datetimepicker组件,有相关样式,但是并没有周的形式,所以要基于datetimepicker去修改组件,解决时使用到了dayjs。上代码

        template模板

<template>
  <div id="app">
    <van-datetime-picker
      v-model="currentDate"
      type="date"
      title="选择年月日"
      :min-date="minDate"
      :max-date="maxDate"
      :filter="filter"
      @change="change"
      @confirm="confirm"
    />
  </div>
</template>

        js代码

<script>
import dayjs from 'dayjs'
export default {
  name: 'App',
  data(){
    return {
      //选择器的最小时间
      minDate: new Date(2020, 0, 1),
      //选择器的最大时间
      maxDate: new Date(2025, 10, 1),
      //双向绑定时间
      currentDate: new Date(2021, 0, 17),
      //自定义周选项的数组
      newOptions:[],
      //拿到的真实时间
      week:null
    }
  },
  mounted(){
    //mounted就得初始化自定义周选项,getNewOptions这个方法传入一个带年和月份的日期对象,返回这个月的对应日期周数组
      this.newOptions = this.getNewOptions(this.currentDate)
  },
  methods:{
    //这是vant组件提供的方法来方便我们自定义周选项
    filter(type, options) {
      if (type === 'day') {
        return this.newOptions;
      }
      return options;
    },
    //这也是vant提供的方法,当选择器时间改变触发
    change(e){
      //e是选择器实例,它有一方法getValues来让我们拿到选择的日期周,需要在DOM后拿到最新的
      this.$nextTick(()=>{
        this.week = e.getValues()
      })
      //每次改变初始化自定义周数组
      this.newOptions = this.getNewOptions(this.currentDate)
      },
      //点击确定后触发
    confirm(){
      console.log(this.week)
    },
    //getNewOptions核心就是这个方法,传入一个年和月,返回这个月对应得日期周数组
    getNewOptions(month) {
      const daysInMonth = dayjs(month).daysInMonth()
      const date = dayjs(month).format('YYYY/MM')
      const week = new Date(date + '/01').getDay()
      let StringWeeks = null
      if (week == 0) {
        StringWeeks = dayjs(date).add(1, 'day').format('YYYY/MM/DD')
      } else if (week == 1) {
        StringWeeks = dayjs(date + '/01').format('YYYY/MM/DD')
      } else {
        StringWeeks = dayjs(date).add(8 - week, 'day').format('YYYY/MM/DD')
      }
      try {
        const t = dayjs(StringWeeks).format('D')
        const times = (daysInMonth - (t - 1)) / 7
        const optionsArr = []
        let day = dayjs(StringWeeks).format('MM/DD')
        optionsArr.push(day)
        for (let i = 1; i <= Math.ceil(times); i++) {
          StringWeeks = dayjs(StringWeeks).add(6, 'day')
          day = dayjs(StringWeeks).format('MM/DD')
          optionsArr.push(day)
          StringWeeks = dayjs(StringWeeks).add(1, 'day')
          day = dayjs(StringWeeks).format('MM/DD')
          optionsArr.push(day)
        }
        console.log(optionsArr, 'optionsArr')
        optionsArr.length % 2 == 0 ? '' : optionsArr.pop()
        this.arrSplicing(optionsArr)
        console.log(optionsArr)
        return this.arrSplicing(optionsArr)
      } catch (err) {
        alert(err, 'er')
      }
    },
    //这个方法辅助getNewOptions
    arrSplicing(arr) {
          let newArr = []
          let flag = 0
          for (let i = 1; i <= arr.length / 2; i++) {
              newArr.push(`${arr[flag]}-${arr[flag + 1]}`)
              flag += 2
          }
          return newArr
    }
  },
      
}
</script>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值