自定义日历范围

需要下moment包

javascript 复制代码
<template>
  <div>
    <el-button type="primary" @click="getDailyAllocation()">自定义日历</el-button>
    <el-dialog title="选择跳过日期" :visible.sync="dialogVisible" :close-on-click-modal="false" width="700px">
      <div class="date-list">
        <div class="date-items" v-for="(item) in week" :key="item">{{item}}</div>
        <div class="date-item" v-for="(item,index) in timeData" :key="index" :class="item.flag ? 'on' : '' ">
          <el-link @click="selectDay(item)" :underline="false" :disabled='array.includes(item.allocationDate)'>
            <div v-if="item.allocationDate">
              <div>{{item.allocationDate}}</div>
            </div>
          </el-link>
        </div>
      </div>

      <span slot="footer" class="dialog-footer">
        <div>
          <el-button @click="dialogVisible = false">取 消</el-button>
          <el-button @click="submit()">提 交</el-button>
        </div>
      </span>
    </el-dialog>
  </div>
</template>

<script>
import moment from 'moment'
export default {
  data () {
    return {
      time: [], // 用来高亮日期
      week: ['一', '二', '三', '四', '五', '六', '日'],
      array: [], // 补日历的数据
      dialogVisible: false,
      startDate: '2023-12-28', // 开始日期
      endDate: '2024-1-26', // 结束日期
      timeData: [] // 日历
    }
  },
  mounted () {
    this.generateDates()
  },
  methods: {
    // 根据开始日期和结束日期 生成日历数据
    generateDates () {
      const start = new Date(this.startDate);
      const end = new Date(this.endDate);
      const dates = [];

      while (start <= end) {
        const year = start.getFullYear();
        const month = String(start.getMonth() + 1).padStart(2, '0');
        const day = String(start.getDate()).padStart(2, '0');
        const shortDate = `${month}-${day}`;
        const weekDay = this.getWeekDay(start.getDay());

        dates.push({
          allocationDate: `${year}-${month}-${day}`,
          shortDate: shortDate,
          weekDay: weekDay,
          flag: false
        })

        start.setDate(start.getDate() + 1);
      }

      this.timeData = dates;
    },
    getWeekDay (dayIndex) {
      const daysOfWeek = ['SUNDAY', 'MONDAY', 'TUESDAY', 'WEDNESDAY', 'THURSDAY', 'FRIDAY', 'SATURDAY']
      return daysOfWeek[dayIndex]
    },
    // 数据处理展示成日历
    async getDailyAllocation () {
      let startDate = moment(this.timeData[0].allocationDate)
      let endDate = null
      let week = moment(startDate).weekday()
      // week 为0 说明是周日
      if (week === 0) {
        week = 7
      }
      if (week > 1) {
        week = week - 1
        startDate = moment(startDate).subtract(week, 'days')
        endDate = moment(this.timeData[0].allocationDate)
        // 大于周一的数据都存储
        const arr = []
        // arr.push({ allocationDate: startDate.format('YYYY-MM-DD') })
        arr.push({ allocationDate: '' })
        while (startDate.add(1, 'days').isBefore(endDate)) {
          // 注意这里add方法处理后SDate对象已经改变。
          arr.push({ allocationDate: '' })
        }
        this.timeData = [...arr, ...this.timeData]
        // 拿到补的数据
        this.array = arr.map(item => item.allocationDate)
      }
      this.dialogVisible = true
    },
    // 选择日期
    async selectDay (item) {
      if (!this.timeData || !Array.isArray(this.timeData)) {
        console.error('timeData is not an array or undefined')
        return
      }
      if (!this.time || !Array.isArray(this.time)) {
        console.error('time is not an array or undefined')
        return
      }
      const tempSet = new Set(this.time)
      for (const item2 of this.timeData) {
        if (item.allocationDate === item2.allocationDate) {
          item.flag = !item.flag
        }
        if (item.flag) {
          tempSet.add(item.allocationDate)
        } else {
          tempSet.delete(item.allocationDate)
        }
      }
      this.time = Array.from(tempSet)
    },
    // 提交
    submit () {
      // 数据排列
      console.log(this.time.sort((item1, item2) => new Date(item1) - new Date(item2)))

    }
  }
}
</script>

<style lang="less" scoped>
.date-list {
  width: 100%;
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  .date-item,
  .date-items {
    width: calc(100% / 7);
    text-align: center;
  }
  .date-items {
    line-height: 40px;
    height: 40px;
    background: #f5f7fa;
  }
  .date-item {
    height: 60px;
    cursor: pointer;
    border: 1px solid #e4e7ed;
    box-sizing: border-box;
    .el-link {
      width: 100%;
      height: 100%;
    }
  }
}
.on {
  background: #409eff;
  .el-link.el-link--default {
    color: #ffff;
  }
}
</style>
相关推荐
西红柿计算机毕设1 分钟前
基于安卓Android的健康饮食系统APP(源码+文档+部署+讲解)
大数据·数据库·vue.js·spring boot·python·android-studio
小满zs2 分钟前
React第十二章(useSyncExternalStore)
前端·javascript·react.js
风吹落叶花飘荡3 分钟前
从零开始的 vue项目部署到服务器详细步骤(vue项目build打包+nginx部署+配置ssl证书)
服务器·vue.js·nginx
Mrs_Lupin4 分钟前
React核心思维模型(一)
前端·react.js·前端框架
你不讲 wood17 分钟前
预览 PDF 文档
开发语言·前端·javascript·pdf·html·node·文件预览
我就说好玩36 分钟前
基于echarts、php、Mysql开发的数据可视化大屏
前端·后端·信息可视化·echarts
2301_7891695438 分钟前
ai说ajax
前端·javascript·ajax
Mr.app1 小时前
JS动态调用变量
javascript
小白讲前端1 小时前
炫酷的登录框!(附源码)
前端·javascript·css·html
架构师ZYL1 小时前
python之数据结构与算法(数据结构篇)-- 元组
开发语言·javascript·python·信息可视化·数据结构与算法