vue+elementui实现12个日历平铺,初始化工作日,并且可点击

news2025/1/9 5:49:59
<template>
  <div class="app-container">
    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true">
      <el-form-item label="年份" prop="holidayYear">
        <el-date-picker
          v-model="queryParams.holidayYear"
          type="year"
          :clearable="false"
          placeholder="选择年"
        >
        </el-date-picker>
      </el-form-item>
      <el-form-item>
        <el-button
          type="primary"
          icon="el-icon-search"
          size="mini"
          @click="handleQuery"
          >搜索</el-button
        >
        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
          >重置</el-button
        >
      </el-form-item>
    </el-form>
    <el-row>
      <el-button type="primary" @click="submitClickedDates">提交</el-button>

      <div v-for="(cal, index) in defaultCals" :key="index">
        <el-col :span="6">
          <el-calendar :value="cal" class="holiday">
            <template slot="dateCell" slot-scope="{ date, data }">
              <div
                class="holiday-cell"
                v-show="data.type === 'current-month'"
                :id="cal.getMonth() + '-' + data.day"
                @click="selectCalendarDate(cal, data)"
                :style="{ backgroundColor: getCellBackgroundColor(cal, data) }"
              >
                {{ data.day.split("-")[2] }}
              </div>
            </template>
          </el-calendar>
        </el-col>
      </div>
    </el-row>
  </div>
</template>

<script>
export default {
  // name: "temp",
  data() {
    return {
      queryParams: {
        holidayYear: new Date(),
      },
      //设置的月份
      defaultCals: [],
      // 全年已选中的日期
      holidayDate: [],
      clickedDates: [], // 记录点击的日期
      selectedDates: [], // 初始选中的日期数组
    };
  },
  created() {
    //初始化日历
    let nowYear = new Date().getFullYear();
    this.initCalendar(nowYear + 1);

    // 初始化日历
    // let nowYear = new Date().getFullYear();
    // this.currentMonth = new Date(); // 明确初始化this.currentMonth
    // this.initCalendar(nowYear + 1);
  },
  methods: {
    // 根据给定的年份获取一年中周一到周五的日期数组
    getWeekdays(year) {
      const weekdays = [];
      const currentDate = new Date(year, 0, 1); // 设置为给定年份的第一天

      // 遍历一年中的每一天
      while (currentDate.getFullYear() === year) {
        const dayOfWeek = currentDate.getDay();

        // 如果是周一到周五,将日期格式化并添加到数组中
        if (dayOfWeek >= 1 && dayOfWeek <= 5) {
          const formattedDate = `${currentDate.getFullYear()}-${(
            currentDate.getMonth() + 1
          )
            .toString()
            .padStart(2, "0")}-${currentDate
            .getDate()
            .toString()
            .padStart(2, "0")}`;
          weekdays.push(formattedDate);
        }

        // 将日期增加一天
        currentDate.setDate(currentDate.getDate() + 1);
      }

      return weekdays;
    },
    //初始化日历
    initCalendar(year) {
      this.defaultCals = [
        new Date(year, 0, 1),
        new Date(year, 1, 1),
        new Date(year, 2, 1),
        new Date(year, 3, 1),
        new Date(year, 4, 1),
        new Date(year, 5, 1),
        new Date(year, 6, 1),
        new Date(year, 7, 1),
        new Date(year, 8, 1),
        new Date(year, 9, 1),
        new Date(year, 10, 1),
        new Date(year, 11, 1),
      ];

      //调接口获取
      this.holidayDate = this.getWeekdays(year);
      console.log(this.holidayDate);
      // 转化为对象数组
      const formattedDates = this.holidayDate.map((date) => {
        const dateObj = new Date(date);
        return {
          cal: dateObj,
          data: {
            day: date,
            isSelected: false,
            type: "current-month",
          },
        };
      });
      console.log(formattedDates);
      console.log("chushihua");
      this.clickedDates = formattedDates;

      this.$nextTick(() => {
        let holidayCell = document.getElementsByClassName("holiday-cell");
        for (let i in holidayCell) {
          if (undefined != holidayCell[i].style) {
            holidayCell[i].style.backgroundColor = "#FFFFFF";
          }
        }
        //给已选中的日期加背景色
        for (let i in this.holidayDate) {
          const month = parseInt(this.holidayDate[i].split("-")[1]) - 1;
          let span = document.getElementById(month + "-" + this.holidayDate[i]);
          span.style.backgroundColor = "#F56C6C";
        }
      });
    },
    /** 搜索按钮操作 */
    handleQuery() {
      let year = this.queryParams.holidayYear.getFullYear();
      this.initCalendar(year);
    },
    /** 重置按钮操作 */
    resetQuery() {
      this.resetForm("queryForm");
      this.queryParams.holidayYear = new Date();
      this.handleQuery();
    },

    // 获取日期单元格的背景颜色
    getCellBackgroundColor(cal, data) {
      console.log("获取日期单元格的背景颜色");
      const clickedDate = this.clickedDates.find((clickedDate) => {
        return (
          clickedDate.cal.getFullYear() === cal.getFullYear() &&
          clickedDate.cal.getMonth() === cal.getMonth() &&
          clickedDate.data.day === data.day
        );
      });

      return clickedDate ? "#F56C6C" : "#FFFFFF";
    },

    // 点击日期单元格的事件
    selectCalendarDate(cal, data) {
      const clickedDateIndex = this.clickedDates.findIndex((clickedDate) => {
        console.log(clickedDate);

        return (
          clickedDate.cal.getFullYear() === cal.getFullYear() &&
          clickedDate.cal.getMonth() === cal.getMonth() &&
          clickedDate.data.day === data.day
        );
      });
      if (clickedDateIndex !== -1) {
        // 如果日期已经被点击过,移除记录并取消背景色
        this.clickedDates.splice(clickedDateIndex, 1);
      } else {
        // 否则,记录点击的日期
        this.clickedDates.push({ cal, data });
      }
      console.log(this.clickedDates);
    },
    // 提交按钮点击事件
    submitClickedDates() {
      const formattedDates = this.clickedDates.map((clickedDate) => {
        const date = clickedDate.data.day;
        const formattedDate = `${clickedDate.cal.getFullYear()}-${
          date.split("-")[1]
        }-${date.split("-")[2]}`;
        return formattedDate;
      });

      // 在这里处理格式化后的日期数组
      console.log("Formatted Dates:", formattedDates);

      // let dates = ['2025-01-01', '2025-01-06', '2025-01-07', '2025-01-08', '2025-01-10'];

      // 将日期字符串转换为 Date 对象
      // let dateObjects = dates.map(dateString => new Date(dateString));

      // // 按照 Date 对象进行排序
      // dateObjects.sort((a, b) => a - b);

      // // 将排序后的 Date 对象转换回日期字符串
      // let sortedDates = dateObjects.map(date => date.toISOString().split('T')[0]);

      // console.log(sortedDates);
    },
  },
};
</script>

<style>
.holiday .el-calendar__button-group {
  display: none;
}

.select-month .el-calendar__button-group {
  display: none;
}

.holiday .el-calendar-day {
  padding: 1px;
  width: 100%;
  height: 34px;
}

.select-month .el-calendar-day {
  padding: 1px;
  width: 100%;
}

.holiday-cell {
  width: 100%;
  height: 100%;
  display: flex;
  justify-content: center;
  align-items: center;
}
</style>


在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1402185.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SQL 注入总结(详细)

一、前言 这篇文章是最近学习 SQL 注入后的笔记&#xff0c;里面整理了 SQL 常见的注入方式&#xff0c;供大家学习了解 SQL 注入的原理及方法&#xff0c;也方便后续自己回顾&#xff0c;如有什么错误的地方欢迎指出&#xff01; 二、判断注入类型 按照注入点类型分类 数字型…

精品基于Uniapp+springboot疫情资讯信息管理系统App-新闻

《[含文档PPT源码等]精品基于Uniappspringboot疫情信息管理系统App》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 软件开发环境及开发工具&#xff1a; 开发语言&#xff1a;Java 后台框架&#xff1a;springboot、ssm …

峰华卓立:iPaaS集成平台,全面加速推进企业数智化建设

01 企业介绍 峰华卓立&#xff08;证券代码&#xff1a;834914&#xff09;是一家聚焦于3DP&#xff08;粘结剂喷射技术&#xff09;打印装备的研发、制造、销售及应用服务为一体的综合性服务供应商&#xff0c;国家高新技术企业&#xff0c;行业专精特新企业&#xff0c;工业级…

JAVA RPC Thrift基操实现与微服务间调用

一、Thrift 基操实现 1.1 thrift文件 namespace java com.zn.opit.thrift.helloworldservice HelloWorldService {string sayHello(1:string username) }1.2 执行命令生成Java文件 thrift -r --gen java helloworld.thrift生成代码HelloWorldService接口如下 /*** Autogene…

进程内协同:原子操作、互斥、同步和通信的原理

进程内协同&#xff0c;简单来说&#xff0c;就是在一个进程内部&#xff0c;多个执行体&#xff08;如线程、协程&#xff09;如何共享资源&#xff0c;如何协同工作以完成一项任务。这涉及到一系列的机制和技术&#xff0c;包括原子操作、互斥、同步和通信等。 那么&#xf…

Opencv轮廓检测运用与理解

目录 引入 基本理解 加深理解 ①比如我们可以获取我们的第一个轮廓,只展示第一个轮廓 ②我们还可以用一个矩形把我们的轮廓给框出来 ③计算轮廓的周长和面积 引入 顾名思义,就是把我们图片的轮廓全部都描边出来 也就是我们在日常生活中面部识别的时候会有一个框,那玩意就…

C语言实战系列一:经典贪食蛇

C语言学习必须实战&#xff0c;并且学完语法后就必须立即用实战来巩固。一般需要10来个比较复杂的程序才能掌握C语言。今天就教大家第一个小程序&#xff0c;贪食蛇。 首先上代码 一、代码 #include <stdio.h> #include <stdlib.h> #include <curses.h> #…

windows用mingw(g++)编译opencv,并install安装

windows下用mingw编译opencv貌似不支持cuda&#xff0c;选cuda会报错&#xff0c;我无法解决&#xff0c;所以没选cuda&#xff0c;下面两种编译方式支持。 如要用msvc编译opencv&#xff0c;参考我另外一篇文章。 如要用Ubuntu编译opencv&#xff0c;参考我另外一篇文章http…

UE5 Windows打包时报错“SDK Not Found”解决方案

在Unreal Engine 5.0.3 Windows平台下打包时报错&#xff1a;“Windows的SDK未正常安装&#xff0c;而其是生成数据的必需项。请检查主工具栏中“启动“菜单SDK部分来更新SDK。” 解决方案&#xff1a; 1、打开 Visual Studio Installer&#xff0c;点击“修改”按钮&#xf…

时空预测网络ST-Resnet 代码复现

ST-ResNet&#xff08;Spatio-Temporal Residual Network&#xff09;是一种用于处理时空数据的深度学习模型&#xff0c;特别适用于视频、时间序列等具有时空结构的数据。下面是一个简单的使用PyTorch搭建ST-ResNet的示例代码。请注意&#xff0c;这只是一个基本的示例&#x…

Hadoop基本概论

目录 一、大数据概论 1.大数据的概念 2.大数据的特点 3.大数据应用场景 二、Hadoop概述 1.Hadoop定义 2.Hadoop发展历史 3.Hadoop发行版本 4.Hadoop优势 5.Hadoop1.x/2.x/3.x 6.HDFS架构 7.Yarn架构 8.MapReduce架构 9.大数据技术生态体系 一、大数据概论 1.大数…

【动态规划】【广度优先搜索】【状态压缩】847 访问所有节点的最短路径

作者推荐 视频算法专题 本文涉及知识点 动态规划汇总 广度优先搜索 状态压缩 LeetCode847 访问所有节点的最短路径 存在一个由 n 个节点组成的无向连通图&#xff0c;图中的节点按从 0 到 n - 1 编号。 给你一个数组 graph 表示这个图。其中&#xff0c;graph[i] 是一个列…

Java开发分析工具 JProfiler的详细使用方法解析(附 JProfiler for Mac许可证秘钥)

JProfiler 是一款功能强大的Java代码分析工具&#xff0c;JProfiler的直观UI可帮助您解决性能瓶颈&#xff0c;确定内存泄漏并了解线程问题且JProfiler Mac破解版配置会话非常简单&#xff0c;第三方集成使得入门变得轻而易举&#xff0c;并且以自然的方式呈现数据分析。 解…

AlmaLinux 8.9 安装图解

风险告知 本人及本篇博文不为任何人及任何行为的任何风险承担责任&#xff0c;图解仅供参考&#xff0c;请悉知&#xff01;本次安装图解是在一个全新的演示环境下进行的&#xff0c;演示环境中没有任何有价值的数据&#xff0c;但这并不代表摆在你面前的环境也是如此。生产环境…

C++ 知识列表【图】

举例C的设计模式和智能指针 当谈到 C 的设计模式时&#xff0c;以下是一些常见的设计模式&#xff1a; 工厂模式&#xff08;Factory Pattern&#xff09;&#xff1a;用于创建对象的模式&#xff0c;隐藏了对象的具体实现细节&#xff0c;只暴露一个公共接口来创建对象。 单例…

scanpy预处理总结

欢迎关注我们组的微信公众号&#xff0c;更多好文章在等你呦&#xff01; 微信公众号名&#xff1a;碳硅数据 公众号二维码&#xff1a; 记录一下关于scanpy preprocessing的结果 import scanpy as sc adata sc.read("/Users/yxk/Desktop/test_dataset/pbmc/pbmc.h5ad&…

【Proteus仿真】【Arduino单片机】甲醛浓度检测报警器

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器&#xff0c;使用蜂鸣器LED模块、LCD1602显示模块、按键、MS1100甲醛传感器模块等。 主要功能&#xff1a; 系统运行后&#xff0c;LCD1602显示甲醛气体浓度检…

SystemC学习笔记(三) - 查看模块的波形

简述 波形在Simulation/Emulation中地位十分重要&#xff0c;尤其是在研发初期&#xff0c;只能通过波形来查看软件hang住的位置。 对于TLM来说&#xff0c;查看波形一般是指查看pvbus上的transaction&#xff0c;而对于SystemC本身来说&#xff0c;查看波形就是使用Gtkwave或…

Python 备份 CSDN 博客

代码来源 根据csdn 中的 一位博主 备份代码修改 新增加 增加了保存图片 到本地&#xff0c;和修改markdown中图片的路径 问题 如果博客的内容太多&#xff0c;需要分多个truck 传输,保存时出现’字符时,无法保存 注意 得获取登陆后的cookie&#xff0c;要不没法从服务器请求回博…