momentJs推导日历组件

news2024/11/27 4:19:51

实现效果:

代码:

引入momentjs然后封装两个函数构建出基本数据结构

import moment from 'moment';

// 某月有多少天
export const getEndDay = (m) => m.daysInMonth();

/**
 * @description 获取本月空值数据
 *  @param { Date } year {  } 年度
 *  @param { Number } month 月份
 *  @param { Date } current moment当天日期
 */
export const getCalendar = ({ year, month, current }) => {
  // 最多6行, 每行为一周7天
  const totalDays = 7 * 6;
  // 获取这个月第一天具体日期
  const start = new Date(year, month - 1, 1);

  let lastEndDay = [];
  // 上个月的天数
  const lastDays = getEndDay(current.clone().subtract(1, 'month'));
  // 当前月的天数
  const nowDays = getEndDay(current);
  const currentDays = [...(new Array(nowDays))].map((v, i) => ({
    day: i + 1,
  })).map((v) => {
    const currentDate = v.day >= 10 ? `${moment(current).format('YYYY-MM')}-${v.day}` : `${moment(current).format('YYYY-MM')}-0${v.day}`;
    return {
      day: v.day,
      denyTime: moment().valueOf() > moment(`${currentDate} 23:59:59`).valueOf(),
      currentDate,
    };
  });
  if (start.getDay() === 0) {
    // 这个月1号为周日,则取上个月最后6天
    lastEndDay = [...new Array(lastDays)].map((v, i) => i + 1).filter((v) => v > lastDays - 6).map((v) => ({
      day: v,
      denyMonth: true,
    }));
  } else {
    lastEndDay = [...(new Array(lastDays))].map((v, i) => i + 1).filter((v, i) => i  > lastDays - start.getDay()).map((v) => ({
      day: v,
      denyMonth: true,
    }));
  }
  // 获取下个月补充天数
  const nextDays = [...new Array(totalDays - lastEndDay.length - currentDays.length)].map((v, i) => ({ day: i + 1, denyMonth: true }));
  const data = [...lastEndDay, ...currentDays, ...nextDays];
  return data;
};

页面代码部分:

<template>
  <div>
    <div class="flex-y-center flex-x-between border-t border-r border-l pad-y-xs pad-x-md">
            <div>{{ renderCalendarMonth }}</div>
            <div class="text-right">
              <el-button size="small" @click="handleMonth(1)">上个月</el-button>
              <el-button size="small" @click="handleMonth()">本月</el-button>
              <el-button size="small" @click="handleMonth(2)">下个月</el-button>
            </div>
          </div>
          <div class="border-a pad-a-sm">
            <div class="grid-week mar-b-sm">
              <div v-for="item in weekLabel" :key="item" class="text-center">
                {{ item }}
              </div>
            </div>
            <div class="grid-month-day">
              <div
                v-for="(item, idx) in CalendarDays"
                :key="idx"
                :class="{
                  'text-center': 1,
                  'grey-out-ban': item.denyMonth || item.denyTime,
                  'active': item.currentDate === activeDay
                }"
                @click="handleDay(item)"
              >
                {{ item.day }}
              </div>
            </div>
          </div>
</div>
</template>

import moment from 'moment';
import { getCalendar } from '../request';

export default {
 data() {
    return {
      weekLabel: ['一', '二', '三', '四', '五', '六', '七'],
      // 当前时间日历推导
      currentTime: moment(),
      // 日历挂表
      CalendarDays: [],
      // 选择日期
      activeDay: moment().format('yyyy-MM-DD'),
      // 月份切换
      activeMonth: 0,
    };
  },
computed: {
    // 日历具体年月份
    renderCalendarMonth() {
      const enumMonth = ['一', '二', '三', '四', '五', '六', '七', '八', '九',  '十', '十一', '十二'];
      const year = moment().subtract(this.activeMonth, 'months').format('yyyy');
      let month = moment().subtract(this.activeMonth, 'months').format('M');
      month = enumMonth[month - 1];
      return `${year}年${month}月`;
    },
  },
created() {
    this.init();
  },
  methods: {
    // 初始化
    init() {
      this.CalendarDays = getCalendar({
        year: moment().format('yyyy'), current: this.currentTime, month: moment().format('M'),
      });
    },
    // 月份切换
    handleMonth(type) {
      if (type) {
        if (type === 1) {
          this.activeMonth++;
        } else {
          this.activeMonth--;
        }
        const day = moment().subtract(this.activeMonth, 'months');
        this.CalendarDays = getCalendar({
          year: day.format('yyyy'),
          current: day,
          month: day.format('M'),
        });
      } else {
        this.activeMonth = 0;
        this.CalendarDays = getCalendar({
          year: moment().format('yyyy'), current: this.currentTime, month: moment().format('M'),
        });
        this.activeDay = moment().format('yyyy-MM-DD');
      }
    },
    handleDay(item) {
      if (item.denyMonth || item.denyTime) return;
      this.activeDay = item.currentDate;
    },
  },


};
</script>

<style lang="scss" scoped>
.grid-week, .grid-month-day {
  display: grid;
  grid-template-columns: repeat(7, 1fr);
  gap: 10px;
}

.grid-month-day {
  &>div {
    padding: 6px 0;
    box-sizing: border-box;
    border: 1px solid $base-border-color;
    &.grey-out-ban {
      background-color: #E9E9EB;
      cursor: not-allowed;
    }
    &:not(.grey-out-ban) {
      color: $base-color-primary;
      cursor: pointer;
    }
    &.active {
      border: 1px solid $base-color-primary;
      background-color: $base-color-primary;
      color: white;
    }
  }
}
</style>

结尾:这里贴代码就挺难受的,没有Vue只有html,果然这个时候用react就不错,不过思路已经提供了,先理清日历的每周对应天数结构,后面处理起来就容易许多。这里附上做的另一个日历效果图,代码就不贴了,js推导函数都差不多,不过是把日期天数的推导改下就可以了。

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

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

相关文章

springboot Feign方式注入注解详解

一、FeignClient注解详解 FeignClient是Spring Cloud中用于声明Feign客户端的注解&#xff0c;它使得编写HTTP客户端变得更简单。通过Feign的自动化配置机制&#xff0c;可以很容易地编写HTTP API客户端。以下是FeignClient的详解&#xff1a; 作用&#xff1a;FeignClient注解…

C++,stl,vector容器详解

目录 1.vector基本概念 2.vector的创建 3.vector赋值操作 4.vector容量和大小的操作 5.vector容器的插入和删除 6.vector容器的数据存取 7.vector互换容器 8.vector容器预留空间 1.vector基本概念 2.vector的创建 #include<bits/stdc.h> using namespace std;int m…

CSS综合案例4

CSS综合案例4 1. 综合案例 我们来做一个静态的轮播图。 2. 分析思路 首先需要加载一张背景图进去需要4个小圆点&#xff0c;设置样式&#xff0c;并用定位和平移调整位置添加两个箭头&#xff0c;也是需要用定位和位移进行调整位置 3. 代码演示 html文件 <!DOCTYPE htm…

一个Vivado仿真问题的debug

我最近在看Synopsys的MPHY仿真代码&#xff0c;想以此为参考写个能实现PWM-G1功能的MPHY&#xff0c;并应用于ProFPGA原型验证平台。我从中抽取了一部分代码&#xff0c;用Vivado自带的仿真器进行仿真&#xff0c;然后就遇到了一个莫名其妙的问题&#xff0c;谨以此文作为debug…

vue3项目中使用mapv

vue3项目中使用mapv mapv是百度地图官方提供的地图数据可视化开源项目&#xff0c;提供了很多效果酷炫的绘图api mapv地址在这里&#xff0c;示例图在这里 先解释为什么要用mapv echarts画的地图&#xff0c;都是行政区划&#xff0c;就算是geo地图&#xff0c;也只能在行政…

基于YOLOv8的暗光低光环境下(ExDark数据集)检测,加入多种优化方式---DCNv4结合SPPF ,助力自动驾驶(一)

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文主要内容:详细介绍了暗光低光数据集检测整个过程&#xff0c;从数据集到训练模型到结果可视化分析&#xff0c;以及如何优化提升检测性能。 &#x1f4a1;&#x1f4a1;&#x1f4a1;加入 DCNv4结合SPPF mAP0.5由原始的0.682提升至…

跳过mysql密码并重置密码 shell脚本

脚本 目前只是验证了5.7 版本是可以的&#xff0c;8.多的还需要验证 以下是一个简单的Shell脚本&#xff0c;用于跳过MySQL密码设置并重置密码&#xff1a; #!/bin/bash yum install psmisc -y# 停止MySQL服务 sudo service mysqld stop# 跳过密码验证 sudo mysqld --skip-g…

品牌如何营造生活感氛围?媒介盒子分享

「生活感」简而言之是指人们对生活的感受和意义&#xff0c;它往往没有充斥在各种重要的场合和事件中&#xff0c;而是更隐藏在细碎平凡的生活场景中。在营销越来越同质化的当下&#xff0c;品牌应该如何打破常规模式&#xff0c;洞察消费情绪&#xff0c;找到更能打动消费者心…

4.JS变量(变量本质,声明,更新,交换,命名规则,let和var的区别,数组简单使用)

什么是变量&#xff1f; 这里就写个人理解把&#xff0c;不仅仅是针对于js&#xff0c;在编程语言中&#xff0c;要想要计算机执行并且理解人类的意图&#xff0c;那么首先计算机要存储人类输入的数据&#xff0c;这个时候变量的作用就来了&#xff0c;变量的意义在于人类告诉…

敏捷开发中的用户故事

用户故事 drawio是一款强大的图表绘制软件&#xff0c;支持在线云端版本以及windows, macOS, linux安装版。 如果想在线直接使用&#xff0c;则直接输入网址drawon.cn或者使用drawon(桌案), drawon.cn内部完整的集成了drawio的所有功能&#xff0c;并实现了云端存储&#xff0c…

LLM是一个向量程序库,提示是查询语言

2013 年&#xff0c;Mikolov 等人在 Google。 注意到一些值得注意的事情。 他们正在构建一个模型&#xff0c;将单词嵌入到向量空间中——这个问题从 20 世纪 80 年代开始就已经有很长的学术历史了。 他们的模型使用了一个优化目标&#xff0c;旨在将单词之间的相关关系转化为…

【刷题日记】最长定差子序列

给你一个整数数组 arr 和一个整数 difference&#xff0c;请你找出并返回 arr 中最长等差子序列的长度&#xff0c;该子序列中相邻元素之间的差等于 difference 。 子序列 是指在不改变其余元素顺序的情况下&#xff0c;通过删除一些元素或不删除任何元素而从 arr 派生出来的序…

HDL Designer 2021.1 如何将默认编辑器修改为VsCode

第1步 安装Vscode 第2步 添加Vscode至HDL Designer 第3步 更改HDL Designer编译器 第4步 修改结束&#xff0c;在HDL Designer中双击block可使用Vscode编辑verilog

SpringBoot+Druid并开启监控页面

介绍 Druid 是一个开源的数据库连接池项目&#xff0c;由阿里巴巴集团开发并贡献给开源社区。它在Java领域中以其高性能、强大功能和易用性著称&#xff0c;是Java应用中广泛使用的数据库连接池组件之一。 Druid 的主要特点包括&#xff1a;   高性能与低延迟&#xff1a; Dr…

2月6日作业

1.现有无序序列数组为23,24,12,5,33,5347&#xff0c;请使用以下排序实现编程 函数1:请使用冒泡排序实现升序排序 函数2:请使用简单选择排序实现升序排序 函数3:请使用快速排序实现升序排序 函数4:请使用插入排序实现升序排序 #include<stdio.h> #include<string.h&…

我的QQ编程学习群

欢迎大家加入我的QQ编程学习群。 群号:950365002 群里面有许多的大学生大佬&#xff0c;有编程上的疑惑可以随时问&#xff0c;也可以聊一些休闲的东西。 热烈欢迎大家加入&#xff01;&#xff01; 上限:150人。

C++核心deque容器,stack容器,queue容器,list容器,set容器,pair ,map容器

3.deque容器 1.deque容器的基本概念 Vector容器是单向开口的连续内存空间&#xff0c;deque则是一种双向开口的连续线性空间。所谓的双向开口&#xff0c;意思是可以在头尾两端插入元素&#xff0c;但是在其头部操作效率奇差&#xff0c;无法被接受。 deque容器和vector容器最…

【C++第二阶段】空指针访问成员函数常成员函数常成员属性

你好你好&#xff01; 以下内容仅为当前认识&#xff0c;可能有不足之处&#xff0c;欢迎讨论&#xff01; 文章目录 空指针访问成员函数常成员函数&常成员属性 空指针访问成员函数 类对象类型的空指针可以访问成员函数&#xff0c;但是不能够访问带有成员属性的成员函数。…

Java基于微信小程序的医院核酸检测服务系统,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

arduino D1 中esp8266 没有ide的库

http://arduino.esp8266.com/stable/package_esp8266com_index.json https://arduino.esp8266.com/stable/package_esp8266com_index.json 这个是官网的包地址 拿到后复制到arduino ide中 然后在开发板管理器&#xff0c;搜索esp&#xff0c;搜出来后安装 去开发板选择 然后测…