vue自定义季度日历

先看效果:
在这里插入图片描述

分析:
一年有12个月,有4个季度,每个季度有3个月。对应如下:

在这里插入图片描述
众所周知,我们js获取到的月份会比实际月份少1,也就是说获取的月份是从0-11.所以修改一下上图:
在这里插入图片描述
为什么季度也从0开始呢—当然是为了在数组中取值和赋值方便呀
由上图很明显的能观察到月份和季度的关系:开始月份=季度3 结束月份=季度3+2
也就是说:根据月份可以知道所在哪个季度,根据季度可以知道包含哪三个月。再计算出每个月1号开始是周几和每个月有多少天,就可以通过循环遍历得到日历啦~;结合实际情况,修改上图的流程图。也是我们接下来的数组结构。。
在这里插入图片描述
分析结束,上代码:

// 获取当前的日期
    getCurrentDate() {
      return new Date();
    },
    // 获取月份对应的是哪个季度
    getQuarterSeasonStartMonth(month) {
      var first = 0;
      var second = 1;
      var third = 2;
      var fourth = 3;
      //月份从0-11
      if (month < 3) {
        return first;
      }

      if (month < 6) {
        return second;
      }

      if (month < 9) {
        return third;
      }

      return fourth;
    },
    // 获取月的天数
    getMonthDays(year, month) {
      
      // 获取当前月的第一天是周几
      var beginWeek = new Date(year, month , 1).getDay();
      // 获取当前月份的天数
      var days = new Date(year, month+1, 0).getDate()
      return [beginWeek, days];
    },
 // 获取季度下对应的月份的开始周几和天数
    getQuarterDays(year, quarter) {
      let currentYearDays = this.daysArray.filter((item) => item.year == year);
      let quartrArray; // 当前年度季度的数组
      if (currentYearDays.length > 0) {
        quartrArray = currentYearDays[0].quarter;
      } else {
      // 一年有4个季度先准备好数组哦~
        quartrArray = [[], [], [], []];
      }
      let cuarrentQuarteyArray = quartrArray[quarter];
      if (cuarrentQuarteyArray.length == 3) {
        this.getShowArray();
        return;
      }
      let beginMonth = quarter * 3;
      let endMonth = quarter * 3 + 2;
      for (beginMonth; beginMonth <= endMonth; beginMonth++) {
        let temp = this.getMonthDays(year, beginMonth);
        if (temp.length == 2) {
          cuarrentQuarteyArray.push({ beginWeek: temp[0], days: temp[1] });
        }
      }
      // 存在
      if (this.daysArray.findIndex((item) => item.year == year) != -1) {
        let index = this.daysArray.findIndex((item) => item.year == year);
        this.daysArray[index].quarter = quartrArray;
      } else {
        this.daysArray.push({
          year: year,
          quarter: quartrArray,
        });
      }
      this.getShowArray();
    },
 getShowArray() {
      this.showArray = [];
      let yearDays = this.daysArray.filter(
        (item) => item.year == this.currentYear
      );
      if (yearDays.length > 0) {
        let quarterArray = yearDays[0].quarter;
        this.showArray = quarterArray[this.currentQuarter];
      }
    }
 // 点击上一步
    clickLast() {
      if (this.currentQuarter > 0) {
        this.currentQuarter--;
      } else {
        this.currentQuarter = 3;
        this.currentYear--;
      }
      this.getQuarterDays(this.currentYear, this.currentQuarter);
    },
    // 点击下一步
    clickNext() {
      if (this.currentQuarter < 3) {
        this.currentQuarter++;
      } else {
        this.currentQuarter = 0;
        this.currentYear++;
      }
      this.getQuarterDays(this.currentYear, this.currentQuarter);
    },

数据准备好了,页面渲染就可以

  <div v-for="(item, index) in showArray" :key="index + currentYear">
        <span class="day_div month_div"
          >{{ currentQuarter * 3 + index + 1 }}</span
        >
        <div class="bottom_line">
          <span
            class="day_div"
            v-for="(week, index) in weekList"
            :key="index * currentYear"
            >{{ week }}</span
          >
        </div>
        <div>
          <span
            class="day_div"
            v-for="(emty, index) in item.beginWeek"
            :key="index * 10 * 2022"
          ></span>
          <span
            class="day_div"
            style="cursor: pointer"
            v-for="(day, dayIndex) in item.days"
            :key="dayIndex"
            >{{ day }}</span
          >
        </div>
      </div>

这里主要是日期的渲染,上个季度、下个季度,只需要修改季度和月份就可以啦。到此结束啦~~
完美,撒花

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值