js 实现月份的切换,初始化当前月,前进到前一个月份,后退到后一个月份。

月份的选择,初始化当前月,前进切换到前一个月,后退后退到后一个月。

1、初始化当前月份的日期,放到数组dayArr里
2、计算当前月份的第一天是星期几
3、计算当前月份有几天
4、计算前一个月最后一天是几号
5、补齐页面显示前一个月的日期
6、补齐页面显示后一个月的日期
7、详细步骤在js注释

页面效果图
在这里插入图片描述

代码部分

<template>
  <div class="monthPage">
    <div class="calendar">
      <!-- 星期 -->
      <div class="weekBox">
        <div v-for="(item, index) in dayArr" :key="index" class="weekTit">
          {{ item }}
        </div>
      </div>

      <!-- 天数 -->
      <div class="itemBox" id="dateBox">
        <div
          v-for="(item, index) in dateArr"
          :key="index"
          class="dateItem">
			<!-- 本月日期-->
          <div class="dateNo">{{ item.No }}</div>
          <!-- 非本月日期 -->
          <div v-show="!item.show" class="oneLabel noData">
            <div class="dateNo">{{ item.No }}</div>
          </div>
        </div>
    </div>
  </div>
</template>

<script>
import { onMounted, reactive, toRefs, watch } from "vue";
import { useCalendarStore } from "@/store/modules/calendar";

export default {
  setup() {
    const calendarStore = useCalendarStore();
    let { pageName, timeMove } = storeToRefs(calendarStore);
    const data = reactive({
      year: "", // 年
      month: "", // 月
      day: "", // 日
      dayArr: [
        "星期日",
        "星期一",
        "星期二",
        "星期三",
        "星期四",
        "星期五",
        "星期六",
      ], // 星期数组
      dateArr: [], // 当前月份的天数
      prevMonth: "",
    });

    const addZero = (date) => {
      return date.toString().padStart(2, "0");
    };

    onMounted(() => {
      let date = new Date();
      data.year = date.getFullYear();
      data.month = date.getMonth();
      data.prevMonth = date.getMonth();
      data.day = addZero(date.getDate()); // 补零
      initDate();
    });

//初始化月份
   const initDate = () => {
      data.dateArr = [];
      let firstDay = new Date(data.year, data.month, 1).getDay(); // 当月第一天星期几
      data.lastDay = new Date(data.year, data.month, 0).getDate(); // 当月最后一天

      let prevLastDate = new Date(data.year, data.prevMonth, 0).getDate(); // 上月的最后一天
      let monthNum = new Date(data.year, data.month + 1, -1).getDate() + 1; // 每月天数
       // 页面的文字显示  ==》 2020-11-02
      let dateStr = data.year + "-" + addZero(Number(data.month) + 1) + "-";
      // 当前月的日期添加到数组里
      for (let i = 1; i < monthNum + 1; i++) {
        let dateS = dateStr + addZero(i);
        data.dateArr.push({ No: i, show: true, punchDate: dateS }); // 遍历添加当前月份的每一天
      }

	  //添加前一个月的日期
      for (let i = 0; i < firstDay; i++) {
        data.dateArr.unshift({
          No: prevLastDate - i,
          show: false,
          punchDate: "",
        }); //向前填充日期
      }

	  // 添加后一个月的日期
      let len = 8 - (data.dateArr.length % 7);
      for (let i = 1; i < len; i++) {
        data.dateArr.push({ No: i, show: false, punchDate: "" }); // 向后填充日期
      }

    };
    watch(
      () => data.timeMove,
      (val) => {
  			// 监控用户点击了月份后一个月
          if (val === "next") {
            data.prevMonth++;
            if (Number(data.month) + 1 > 11) {
              data.month = 0;
              data.year = Number(data.year) + 1;
            } else {
              data.month = Number(data.month) + 1;
            }
            	// 监控用户点击了月份前一个月
          } else if (val === "prev") {
            data.prevMonth--;
            if (Number(data.month) - 1 < 0) {
              data.month = 11;
              data.year = data.year - 1;
            } else {
              data.month = Number(data.month) - 1;
            }
          }
          initDate ();
        }
      },
      {
        deep: true,
      }
    );

    return {
      ...toRefs(data), // 将 data 返回出去,就可以直接使用 data 里面的属性
      initDate ,
    };
  },
};
</script>

<style scoped lang="scss"></style>

写在最后,如有问题欢迎留言~