Vue + moment 实现自定义日历

news2025/1/17 1:16:00

moment
moment是一个js工具库,这个库中封装的是日期时间的方法,功能很全面。可以去moment官网看看,它的中文文档介绍的也很详细,主要是看一下方法的使用。附上官网地址:添加链接描述

日历案例
日历的逻辑:
从当前月出发,必须直到当前月的天数,必须知道当前月第一天是星期几。
只有知道了天数和第一天是星期几,才能知道第一天的位置在哪,要显示几天

案例中需要使用的方法:
以下方法都是在moment()返回对象身上的方法
获取当前日期和时间:moment()
获取某月的天数:daysInMonth()
获取某月的第一天:startOf(‘month’)
获取某天是星期几:weekday()
增加时间:add(Number, String)
减去时间:subtract(Number, String)
设置一周从周一开始(默认是周日开始):locale(‘zh-cn’)
显示格式:format()。这个是使用最多用处最大的方法,它的参数是令牌,令牌不同日期和时间显示不同。

我们来看下效果:
在这里插入图片描述
代码:

<template>
  <div class="public-box" v-else>
    <p>{{ titleVal }}</p>
    <ul class="week-title flex">
      <li v-for="(v, i) in weekList" :key="i">{{ v }}</li>
    </ul>
    <ul class="date-list flex" :class="index % 2 === 0 ? 'odd' : ''" v-for="(arr, index) in dateList" :key="index + 'a'">
      <li :class="obj.class + ' ' + (i === arr.length - 1 ? '' : 'border-right')" v-for="(obj, i) in arr" :key="i">{{ obj.d }}</li>
    </ul>
  </div>
</template>

<script>
import moment from "moment";
// zh-cn默认一周从周一开始
// moment.locale('zh-cn');
export default {
  name: "CalendarDate",
  data() {
    return {
      weekList: ["日", "一", "二", "三", "四", "五", "六"],
      titleVal: '2023-09',
      dateList: []
    };
  },
  mounted() {
    this.setDate();
  },
  methods: {
    setDate() {
      let m = moment('2023-09-01');

      // 获得当前月的天数  和 第一天的星期数
      let curDays = this.getMonthDays(m); // 当前天数
      let curWeek = this.getWeekDays(m.clone()); // 当前月第一天的星期(索引值)
      let upDays = this.getMonthDays(m.clone().subtract(1, "month")); // 上月的天数
      console.log(curWeek);
      let currentM = moment(m).format("YYYY-MM"); // 当前月
      let beforeM = moment(m).subtract(1, "months").format("YYYY-MM"); // 上个月
      let afterM = moment(m).add(1, "months").format("YYYY-MM"); // 下个月
      // 生成的结构
      let strDate = [];
      // 下个月的起始日期
      let nextFirstDate = 0;
      // 日历最多有 6行 6*7
      let allNum = 42;
      for (let i = 0; i < allNum; i++) {
        // 1. 当前月的上一个月 需要显示的日期
        // 返回的索引值刚好是上月在当月显示的天数
        if (i < curWeek) {
          strDate.unshift({
            class: "special",
            d: upDays,
            m: beforeM
          });
          upDays--; // 倒叙显示   30 31
        } else if (i >= curDays + curWeek) {
          // 去除掉当月天数+上月天数就是下月天数
          // 2. 当前月的下一个月:除去当月最后一天+上月的几天剩余的是下月开始计算
          // curWeek 返回值刚好是上月占用的天数
          nextFirstDate++;

          strDate.push({
            class: "special",
            d: nextFirstDate,
            m: afterM
          });
        } else {
          // 3. 当前月
          // i-curWeek+1 为当前月的天数
          // date()获取日期号
          // m.date() == i - curWeek + 1说明这一天是当月当天,添加样式
          let currentClass = moment().date() === i - curWeek + 1 ? "current-day" : "current";

          strDate.push({
            class: currentClass,
            d: i - curWeek + 1,
            m: currentM
          });
        }
      }
      // strDate
      let times = allNum / 7;
      let dateList = [];
      for (let k = 0; k < times; k++) {
        let arr = [];
        for (let i = 0; i < 7; i++) {
          arr.push(strDate[i + k * 7]);
        }
        dateList.push(arr);
      }
      if (dateList[times - 1][0]["m"] === afterM) {
        dateList.pop();
      }
      this.dateList = dateList;
    },
    getWeekDays(momentObj) {
      // 星期几,0-6, 星期天为0
      // 或者用 .day() 效果一样
      return momentObj.startOf("month").weekday();
    },
    getMonthDays(momentObj) {
      return momentObj.daysInMonth();
    }
  }
};
</script>

<style lang="scss" scoped>
.public-box {
  /*height: 290px;*/
  padding: 20px;
  border: 1px solid #dfdfdf;

  > p {
    color: #374256;
    font-weight: 500;
    text-align: center;
    margin-bottom: 10px;
  }

  .week-title {
    width: 100%;
    /*margin-bottom: 10px;*/
    /*border-bottom: 1px solid #dfdfdf;*/
    li {
      text-align: center;
      line-height: 60px;
      font-size: 12px;
      flex: 1;
      background-color: #EAECF3;
      /*width: 30px;*/
      /*margin: 0 8px;*/
    }

  }

  .date-list {
    width: 100%;
    margin-bottom: 3px;

    li {
      text-align: center;
      line-height: 80px;
      color: #475369;
      /*width: 30px;*/
      flex: 1;
      /*margin: 0 8px;*/
      /*border-radius: 15px;*/
      /*cursor: pointer;*/
    }

    .special {
      color: #b1b8c5;
    }
  }

  .odd {
    background-color: #F5F7FD;
  }

  .border-right {
    border-right: 1px solid #D9E1EB;
  }
}
</style>

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

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

相关文章

servlet基础知识

目录 什么是servlet概念/定义作用 servlet容器概念/是什么作用如何配置和管理 servlet生命周期有哪些生命周期每个周期中可以执行哪些操作 创建和编写servlet如何创建一个简单的servletservlet类的结构是什么样的如何处理HTTP请求和响应 servlet映射和URL模式什么是servlet映射…

Unity2017适配安卓12

测试版本为Unity2017.4.25f1 1.在自定义AndroidManifest.xml&#xff08;位于Assets\Plugins\Android\&#xff09;中添加android:exported"true" <?xml version"1.0" encoding"utf-8"?> <manifestxmlns:android"http://schema…

现在学网络安全主要是实战还是打CTF?

当然是实战了!!! 现在的CTF题目是基本不贴近实战的&#xff0c;逻辑结构并不合理&#xff0c;而且出题手十有八九是学生&#xff0c;并没有从教育出发的意义&#xff0c;只是比赛、竞技。 如果说你未来要从事网络安全行业的话肯定是以实战为主的&#xff01;企业在招聘时更多…

如何基于先进视频技术,构建互联网视频监控安全管理平台解决方案

一、建设思路 依托互联网&#xff0c;建设一朵云&#xff0c;实现各类二三类视频资源统一接入&#xff0c;实现天网最后100米、10米、1米的全域覆盖。 依托人工智能与互联网技术&#xff0c;拓展视频资源在政府、社会面等多领域的全面应用&#xff1b;建设与运营模式并存&…

《向量数据库指南》——押注向量数据库 挑战颇多

押注向量数据库 挑战颇多 作为今年以来的热门技术赛道,向量数据库已吸引了大量厂商和创业团队入场,先发者与后来者,老牌厂商与新生力量之间的竞争正在持续升温。 但值得注意的是,向量数据库真的值得厂商全力投入吗? 在《为什么你不应该投资向量数据库?》一文中,吴英骏…

3DEXPERIENCE® SOLIDWORKS® 新功能

先前版本的兼容性 优点 即使其他用户正在使用旧版 SOLIDWORKS&#xff0c;也能轻松与其 协作。 • 通过将您的 3DEXPERIENCE SOLIDWORKS 设计作品保存为旧 版本&#xff0c;与使用旧版本的供应商无缝协作。 • 将零件、装配体和工程图保存为最新版本前两年之内的 3DEXPERIENC…

仿真软件Proteus8.9 SP2 Pro 下载、安装、汉化详细图文教程

Proteus8.9 安装教程 视频教程一、安装软件解压二、软件安装常见问题及解决方法&#xff1a;三、汉化 Proteus8.9 SP2 Pro 安装教程 本破解教程仅供个人及 proteus 8.9粉丝们交流学习之用&#xff0c;请勿用于商业用途&#xff0c; 谢谢支持。此版本为Proteus8.9 SP2 Pro。其他…

Httpd(一)

介绍 httpd是apache超文本传输协议(HTTP)服务器的主程序。被设计为一个独立运行的后台进程&#xff0c;它会建立一个处理请求的子进程或线程的池。 特性 高度模块化&#xff1a;core modules DSO&#xff1a;Dynamic Shared Object 动态加载/卸载 MPM&#xff1a;multi-p…

TCP/IP(八)TCP的连接管理(五)四次握手

一 tcp连接断开 每一个TCP报文的超时重传都由一个特定的内核参数来控制 ① 四次握手的过程 遗留&#xff1a; 谁先发送FIN包,一定是client吗? --> upload和download补充&#xff1a; 主动和被动断开连接的场景 "四次握手过程描述" F --> FIN --> F…

LeetCode-144-二叉树的前序遍历

题目描述&#xff1a; 题目链接&#xff1a;LeetCode-144-二叉树的前序遍历 递归法 解题思路&#xff1a; 方法一&#xff1a;递归。 要先清楚前序遍历的顺序&#xff1a;先根节点&#xff0c;再左子树&#xff0c;再右子树。 然后是递归三部曲&#xff1a; 确定递归函数的参数…

香港硬防服务器的防御有什么优缺点?

​  在选择服务器时&#xff0c;安全性是一个重要的考虑因素。而对于那些需要高级防御功能的用户来说&#xff0c;香港硬防服务器可能是一个不错的选择。它也有一些优缺点需要考虑。 香港硬防服务器优点&#xff1a; 强大的硬件资源&#xff1a;香港硬防服务器拥有足够的硬件…

Session共享问题

出现这个问题的原因&#xff0c;从根本上来说是因为Http协议是无状态的协议。客户端和服务端在某次会话中产生的数据不会被保留下来&#xff0c;所以第⼆次请求服务端无法认识到你曾经来过&#xff0c; Http为什么要设计为无状态协议&#xff1f;早期都是静态页面无所谓有无状态…

初识华为云数据库GaussDB for openGauss

01 前言 GaussDB是华为自主创新研发的分布式关系型数据库。该产品具备企业级复杂事务混合负载能力&#xff0c;同时支持分布式事务&#xff0c;同城跨AZ部署&#xff0c;数据0丢失&#xff0c;支持1000的扩展能力&#xff0c;PB级海量存储。同时拥有云上高可用&#xff0c;高可…

【大数据】HBase入门指南

原创不易&#xff0c;注重版权。转载请注明原作者和原文链接 文章目录 HBase特性Hadoop的限制基本概念NameSpaceTableRowKeyColumnTimeStampCell 存储结构HBase 数据访问形式架构体系HBase组件HBase读写流程读流程写流程 MemStore Flush参数说明 StoreFile Compaction参数说明触…

httprunnet自动化测试实战

引言 自动化测试是指使用软件工具、脚本或编程来执行测试任务&#xff0c;以代替人工执行测试用例的过程。它使用自动化工具和技术来模拟用户操作&#xff0c;验证和评估软件应用程序的功能、性能和稳定性。 自动化测试的主要目的是提高测试效率和质量&#xff0c;它具有以下几…

记一次python 正则表达式

1 正则一般用到的所有字符&#xff0c;具体每个字符的用法自行百度 2 案例&#xff0c;理解了这个案例基本上没问题了&#xff0c;4种格式的字符串&#xff0c;都能提取生日信息 import reline "xxx出生于2001年6月1日" line "xxx出生于2001/6/1" line…

C语言,低洼地问题

最简单的低洼地的特征是前边下坡后边上坡。即三个数&#xff0c;第一个数比第二个数大&#xff0c;第二个数比第三个数小。 但是也有两种特殊情况&#xff1a; 第一种&#xff0c;就是图中序号3的那个低洼地&#xff0c;先下坡再平坡然后又是上坡&#xff0c;这里也算一个低洼…

计算机毕业设计选什么题目好?springboot 大学餐厅菜品推荐和点评系统

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

element树形控件编辑节点组装节点

需求功能&#xff1a; 编辑树节点&#xff0c;组装节点 <el-scrollbar class"scrollbar-wrapper"><el-tree :data"nodeList" ref"tree" :props"defaultProps" :expand-on-click-node"false"><template slot…

golang jwt(hs,es,rs,ed)密钥生成、加签验签案例

golang JWT加签算法及使用案例 JWT原理 查看官方lib库 官方lib库 选择go语言 数据结构定义 secret.go package secretconst KEY_PATH "keys"type OutSecret struct {Secret string // 哈希签名PublicKeyFile stringPrivateKeyFile string } // 密钥生成 typ…