vue2实现一个简易实用的日历(可特殊标记多个日期)

效果如下:


 

<template>
    <div class="calendar">
      <div class="header">
        <button @click="previousMonth">&lt;</button>
        <h2>{{ currentYear }}-{{ currentMonth }} </h2>
        <button @click="nextMonth">&gt;</button>
      </div>
      <div class="days">
        <div v-for="day in daysOfWeek" :key="day" class="week">{{ day }}</div>
        <div v-for="blank in firstDayOfMonth" :key=" 'black'+blank" class="day"></div>
        <div
          v-for="(date, index) in daysInMonth"
          :key="index"
          class="day"
          :class="{ 'marked-date': isMarkedNowDate(date) }"
        >
          <span :style="{ color: isMarkedDate(date) ? '#73DE07' : 'white' }">{{ date.getDate() }}</span>
        </div>
      </div>
    </div>
  </template>
  
  <script>
  export default {
    name: 'Calendar',
    props: {
    //   markedDates: {
    //     type: Array,
    //     default: () => []
    //   }
    },
    data() {
      return {
        currentDate: new Date(),
        currentYear: '',
        currentMonth: '',
        markedDates: ['2024-06-16', '2024-06-15', '2024-06-01'],
        daysOfWeek: ['日', '一', '二', '三', '四', '五', '六'],
        firstDayOfMonth: 0,
        daysInMonth: []
      };
    },
    
    mounted() {
      this.updateMonthAndYear();
      this.daysInMonths();
      this.firstDayOfMonths();
    },
    methods: {   
      firstDayOfMonths() {
        // getDay() 方法可返回一周(0~6)的某一天的数字。
        // 注意: 星期天为 0, 星期一为 1, 以此类推。
        const firstDay = new Date(this.currentDate.getFullYear(), this.currentDate.getMonth(), 1).getDay();
        this.firstDayOfMonth = firstDay === 0 ? 0 : firstDay; // Adjusting for Sunday being the first day
      },
     daysInMonths() {
        this.daysInMonth = [];
        const firstDay = new Date(this.currentYear, this.currentDate.getMonth(), 1);
        const lastDay = new Date(this.currentYear, this.currentDate.getMonth() + 1, 0);
  
        let currentDay = firstDay;
        while (currentDay <= lastDay) {
          this.daysInMonth.push(new Date(currentDay));
          currentDay.setDate(currentDay.getDate() + 1);
        }
      },
      
      updateMonthAndYear() {
        this.currentYear = this.currentDate.getFullYear();
        this.currentMonth = this.pad(this.currentDate.getMonth() + 1);
      },
      pad(num) {
        return num < 10 ? '0' + num : num;
      },
      isMarkedDate(date) {
        const formattedDate = `${date.getFullYear()}-${this.pad(date.getMonth() + 1)}-${this.pad(date.getDate())}`;
        return this.markedDates.includes(formattedDate);
      },
      isMarkedNowDate(date) {
        const now = new Date();
        const nowDate = `${now.getFullYear()}-${this.pad(now.getMonth() + 1)}-${this.pad(now.getDate())}`;
        const formattedDate = `${date.getFullYear()}-${this.pad(date.getMonth() + 1)}-${this.pad(date.getDate())}`;
        return nowDate==formattedDate;
      },
      previousMonth() {
        this.currentDate.setMonth(this.currentDate.getMonth() - 1);
        this.firstDayOfMonths();
        this.updateMonthAndYear();
        this.daysInMonths()
      },
      nextMonth() {
        this.currentDate.setMonth(this.currentDate.getMonth() + 1);
        this.firstDayOfMonths();
        this.updateMonthAndYear();
        this.daysInMonths()
        
      }
    }
  };
  </script>
  
  <style scoped>
  .calendar {
    width: 4.5455rem;
    padding: .1818rem;
  }
  .header {
    display: flex;
    align-items: center;
    justify-content: space-between;
    margin-bottom: .1818rem;
    color: white;
  }
  .days {
    display: grid;
    grid-template-columns: repeat(7, 1fr);
  }
  .week {
    padding: .0909rem;
    text-align: center;
    color: #b9c9dd80;
  }
  .day {
    padding: .0909rem;
    text-align: center;
    color: white;
  }
  .marked-date {
    background: #00A6FF;
    border-radius: .0727rem;
  }
  </style>
  

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

会员收银系统源码

会员营销是一种基于会员管理的营销方法&#xff0c;通过提供会员专属的优惠、服务和体验&#xff0c;吸引和保留客户&#xff0c;促进客户的持续消费。与直接打折相比&#xff0c;会员营销具有以下优势&#xff1a; 1.增强客户忠诚度 会员营销可以通过提供个性化的服务和专属…

【面试八股文】谈一谈你对TCP和UDP的区别是怎么理解的?

文章目录 一、TCP和UDP的区别,使用打电话和写信来类比1.1 TCP就像打电话1.2 UDP就像写信1.3 总结二、专业的讲解`TCP`和`UDP`的区别2.1 TCP和UDP的概念2.2 是否面向连接2.3 从连接对象个数来看2.3.1 UDP:UDP支持一对一、一对多、多对一、多对多的通信。2.3.3 TCP:TCP是一对一…

快速了解接口测试

1、定义 什么是接口测试&#xff1f; 接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及系统间的相互逻辑依赖关系等。 接口测…

第一次创建next.js项目

当前环境和版本&#xff1a; 创建命令&#xff1a; npx create-next-applatest test-nextjs 下载过程&#xff1a; 虽然下载过程有warning&#xff0c;但是还是下载成功了 node.js稳定版本号&#xff1a;http://t.csdnimg.cn/WokUx 因为它前面warn说要> 18.17.0 所以下载了…

正则表达式常用表示

视频教程&#xff1a;10分钟快速掌握正则表达式 正则表达式在线测试工具&#xff08;亲测好用&#xff09;&#xff1a;测试工具 正则表达式常用表示 限定符 a*&#xff1a;a出现0次或多次a&#xff1a;a出现1次或多次a?&#xff1a;a出现0次或1次a{6}&#xff1a;a出现6次a…

如何避免WordPress更新导致的网站崩溃

我查阅过很多关于如何确保 WordPress 网站安全的建议&#xff0c;其中最常提到的就是及时更新 WordPress。 我按照建议更新了网站&#xff0c;结果却导致网站崩溃。 网站的瘫痪后&#xff0c;我甚至连WordPress仪表板都无法登陆&#xff0c;只留下了一条让我困惑的错误信息&a…

mysql数据库中触发器的使用

一、修改分隔符号 delimiter $$或者是//或者~~都行 二、创建触发器函数名称 create trigger 函数名 三、什么样的操作出发&#xff0c;操作那个表 after&#xff1a;.....之后触发 befor&#xff1a;.....之前触发 insert&#xff1a; 插入触发 update&#xff1a;修改被触发 d…

【Java】已解决java.lang.UnsupportedOperationException异常

文章目录 问题背景可能出错的原因错误代码示例正确代码示例注意事项 已解决java.lang.UnsupportedOperationException异常 在Java编程中&#xff0c;java.lang.UnsupportedOperationException是一个运行时异常&#xff0c;通常表示尝试执行一个不支持的操作。这种异常经常发生…

以太坊智能合约不能调用:一定注意智能合约地址,每次部署地址都会变化;nonce值 什么作用,是什么;在交易中调用智能合约添加附加信息

目录 以太坊智能合约不能调用 一定注意智能合约地址,每次部署地址都会变化 Transaction must include these fields: %r" % missing_keys 缺少nonce nonce值 什么作用,是什么 在交易中调用智能合约添加附加信息 1. 定义智能合约 2. 部署并调用智能合约 注意事项…

集合进阶:增强for循环和lambda表达式

一.增强for遍历 1.增强for的底层是迭代器,为了简化迭代器的代码书写的。 2.他是JDK5之后出现的,其内部原理就是一个lterrator迭代器。 3.所有的单列集合和数组才能用增强for进行遍历 二.格式 for(元素的数据类型 变量名;数组或者集合){} 三.代码 Collection<String>…

聆听你的声音 ,华为云Astro Zero邀您参加产品满意度调查

亲爱的开发者 几分钟时间&#xff0c;大大的影响&#xff01; 邀您参加Astro Zero满意度调查 助我们优化您的开发体验。 为什么您应该参与&#xff1f; 塑造产品&#xff1a;直接影响Astro Zero的未来改进&#xff01; 聆听声音&#xff1a;这是一个让您的声音被听见的机…

Contact-Rich Robot ManipulationTask:grinding and Peg-in-Hole Assembly

Contact-Rich Robot Manipulation Task涵盖了多种需要机器人与环境或物体进行密切接触的复杂操作。 1. Grinding&#xff08;研磨&#xff09; 任务描述&#xff1a;研磨是制造业中常见的加工过程&#xff0c;涉及使用研磨工具去除材料表面的一层或多层&#xff0c;以达到预定…

企业常用的五大源代码加密软件

安秉源代码加密软件&#xff1a; 专注于源代码文件的加密&#xff0c;对编译后的文件不加密。 采用版本管理服务器密文保存方式&#xff0c;不影响员工正常开发流程。 有效防止代码从版本管理服务器下载和上传到私有仓库。 适用于企业环境&#xff0c;保护源代码不被泄露。EXEC…

什么是拷贝?我:Ctrl + C ...

前言 当谈及拷贝&#xff0c;你的第一印象会不会和我一样&#xff0c;ctrl c ctrl v ... &#xff1b;虽然效果和拷贝是一样的&#xff0c;但是你知道拷贝的原理以及它的实现方法吗&#xff1f;今天就让我们一起探究一下拷贝中深藏的知识点吧。 拷贝 首先来看下面一段代码…

Maya 白膜渲染简单教程

零基础渲染小白&#xff0c;没关系&#xff0c;一篇超简单教程带你学会渲染白膜。 先打开Maya&#xff0c;看看面板有没有渲染器&#xff0c;这里以Arnold为主。 要是没有这个&#xff0c;就去找插件管理器&#xff0c; Arnold的是mtoa&#xff0c;在搜索栏搜&#xff0c;然后把…

能ping通,但无法上网,看网络高手是如何解决?

经常会发现有一种现象&#xff0c;就是ip能ping通&#xff0c;但是就是无法上网&#xff0c;基本上每位行业的人员都遇到过。 出现这个问题原因主要有以下几个&#xff0c;我们一起来看下。 原因一、ip冲突 所谓的ip冲突&#xff0c;就是由于网络中出现了两个同样的ip地址&a…

React常用方法汇总【更新中】

文章目录 前言创建项目启动命令列表渲染useEffect 异步函数使用方法useEffect 异步函数清除方法控制组件显示隐藏axios 安装使用 前言 运行 react 需要先安装 node.js&#xff0c;具体安装步骤可以参考这篇文章 https://blog.csdn.net/weixin_43721000/article/details/134284…

掌握这三点软文营销技巧:轻松助力品牌传播

在营销方式层出不穷的今天&#xff0c;软文推广已不再只是简单的文字堆砌&#xff0c;而是成为了品牌与消费者深度沟通的桥梁。随着消费者获取信息的渠道越来越多元化&#xff0c;软文推广也迎来了新的趋势和挑战。今日投媒网将与您分享如何在新时代背景下&#xff0c;提升软文…

人工智能技术应用笔记(十二):搭建自带大模型微信,完美对接GPT-4o,Kimi等大模型,智能体平台Coze也能接

许多朋友对如何搭建自己的微信机器人非常感兴趣。今天就来教大家如何操作。 一、 准备工作 一台电脑或者云服务器&#xff0c;对配置要求不高&#xff0c;一般的电脑就行 大模型API调用的Key&#xff0c;比如GPT-4o&#xff0c;Kimi&#xff0c;Deepseek&#xff08;不知道怎…

个人博客测试用例设计

个人博客测试用例设计 个人博客测试用例 分别从功能、性能、安全、兼容及界面分别展开 个人博客测试用例