Vue2.0+Element实现日历组件

news2024/11/20 14:42:42

(壹)博主介绍

🌠个人博客: 尔滨三皮
⌛程序寄语:木秀于林,风必摧之;行高于人,众必非之。

(贰)文章内容

img

1、安装依赖

npm install moment@2.29.4 --save
npm install lunar@0.0.3 --save
npm install lunar-javascript@1.6.7 --save

2、ChineseFestival.js

在utils文件夹内,新建.js

export const worldHolidays = [
    { month: 1, day: 1, name: '元旦' }, // New Year's Day
    { month: 2, day: 14, name: '情人节' }, // Valentine's Day
    { month: 3, day: 8, name: '妇女节' }, // International Women's Day
    { month: 4, day: 1, name: '愚人节' }, // April Fools' Day
    { month: 4, day: 22, name: '地球日' }, // Earth Day
    { month: 5, day: 1, name: '劳动节' }, // International Workers' Day
    { month: 12, day: 25, name: '圣诞节' }, // Christmas Day
]

3、时间格式转换

utils.js 中添加如下函数

// date原型链对象添加format方法,用于format日期格式
Date.prototype.Format = function (fmt) {
  var o = {
    "M+": this.getMonth() + 1, // 月份
    "d+": this.getDate(), // 日
    "h+": this.getHours(), // 小时
    "m+": this.getMinutes(), // 分
    "s+": this.getSeconds(), // 秒
    "q+": Math.floor((this.getMonth() + 3) / 3), // 季度
    S: this.getMilliseconds(), // 毫秒
  }

  if (/(y+)/.test(fmt)) {
    fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length))
  }
  for (var k in o) {
    if (new RegExp("(" + k + ")").test(fmt)) {
      fmt = fmt.replace(RegExp.$1, RegExp.$1.length === 1 ? o[k] : ("00" + o[k]).substr(("" + o[k]).length))
    }
  }

  return fmt
}

// Date对象Transfer对象,将时间戳转换成日期对象
Date.Transfer = function (timeSpan) {
  if (!timeSpan) {
    return new FormatDateNullValue()
  }

  return new Date(timeSpan)
}

4、日历组件

<!-- 日历组件 -->
<template>
  <div class="calendarsBox">
    <section>
      <div class="btnBox">
        <el-button @click="preY" size="mini">上一年</el-button> <el-button @click="nexY" size="mini">下一年</el-button>
      </div>

      <el-calendar v-model="value" ref="ec">
        <template #dateCell="{ date, data }">
          <!-- 日历详细 -->
          <div class="conter">
            <div class="c-box">
              <!-- 月日 -->
              <div class="day">
                {{ Date.Transfer(data.day).Format("MM-dd") }}
              </div>
              <!-- 农历 -->
              <div class="date">{{ lunarcalendar1(date) }}</div>
              <!-- 节气 -->
              <div class="jieqi" v-html="solarTerms(getLunarYMD('y', date), getLunarYMD('m', date), getLunarYMD('d', date))"></div>
              <!-- 中国传统节日 -->
              <div class="jieri">{{ funcFestival(+data.day.split("-")[1], +data.day.split("-")[2]) }}</div>
            </div>

            <div>{{ funcTraditionalFestival(getLunarYMD("y", date), getLunarYMD("m", date), getLunarYMD("d", date)) }}</div>
          </div>
        </template>
      </el-calendar>
    </section>
  </div>
</template>

<script>
import moment from "moment"
import lunar from "lunar-javascript"
import { chineseFestival } from "@/utils/chineseFestival"
export default {
  name: "Calendars",
  components: {},
  data() {
    return {
      date: moment(new Date()),
      value: null,
    }
  },
  methods: {
    preY() {
      // month 接受从 0 到 11 的数字。 如果超出范围,它将冒泡到年份。
      this.funcY("-")
    },
    nexY() {
      this.funcY("+")
    },
    funcY(_symbol) {
      let t, y
      if (_symbol === "+") {
        y = this.date.year() + 1
      } else if (_symbol === "-") {
        y = this.date.year() - 1
      }
      t = moment(`${y}-${moment().month() + 1}-${moment().date()}`)
      this.value = this.funcToDate(t)
      this.funcSynchronous(t)
    },
    funcToDate(_moment) {
      return _moment.toDate()
    },
    funcSynchronous(_t) {
      this.date = moment(_t.toDate())
    },
    lunarcalendar(ymd) {
      return lunar.Solar.fromDate(ymd).getLunar().toFullString()
    },
    lunarcalendar1(ymd) {
      return lunar.Solar.fromDate(ymd).getLunar().toString().split("年")[1]
    },
    funcTraditionalFestival(_y, _m, _d) {
      return lunar.Lunar.fromYmd(+_y, +_m, +_d).getFestivals()[0] ? lunar.Lunar.fromYmd(+_y, +_m, +_d).getFestivals()[0] : ""
    },
    funcTraditionalFestival1(_y, _m, _d) {
      return lunar.Lunar.fromYmd(+_y, +_m, +_d).getOtherFestivals()[0] ? lunar.Lunar.fromYmd(+_y, +_m, +_d).getOtherFestivals()[0] : ""
    },
    solarTerms(_y, _m, _d) {
      var d = lunar.Lunar.fromYmd(_y, _m, _d)
      let jq = d.getJieQi()
      return jq
        ? '<span style="font-family: "zkxw"">' +
            jq +
            "</span>" +
            " " +
            d
              .getJieQiTable()
              [jq].toYmdHms()
              .match(/\d\d:\d\d:\d\d/gi)[0]
        : ""
    },
    getLunarYMD(type, t1) {
      let t,
        d1 = lunar.Lunar.fromDate(t1)
      switch (type) {
        case "y":
          t = d1.getYear()
          break
        case "m":
          t = d1.getMonth()
          break
        case "d":
          t = d1.getDay()
          break
        default:
      }
      return t
    },
    funcFestival(m, d) {
      let festival = chineseFestival.find(i => i.month === m && i.day === d)
      return festival ? festival.name : ""
    },
  },
  mounted() {
    this.value = this.funcToDate(this.date)
    console.log(this.$refs.ec)
    console.log(chineseFestival)
  },
}
</script>

<style lang="less" scoped>
/*移动端适配*/
@media screen and (max-width: 1118px) {
  .calendarsBox {
    width: 100%;
    height: 100%;
    font-family: "lgq";
    position: relative;
    font-size: 0.6rem;
    section {
      //上一年 下一年
      .btnBox {
        position: absolute;
        top: .54rem;
        right: 9.8rem;
        .el-button + .el-button {
          margin-left: 0;
        }
      }
    }
    ::v-deep .el-button {
      border: none;
    }
    ::v-deep .el-button:hover {
      color: #409eff;
      border-color: none;
      background-color: #dae6f5;
    }
    ::v-deep .el-calendar-table .el-calendar-day {
      display: flex;
      align-items: center;
      justify-content: center;
    }
    ::v-deep .el-calendar__body {
      padding: 0 0 0;
    }
    ::v-deep .el-calendar-table td.is-today {
      color: #409eff;
    }
    .conter {
      text-align: center;

      .c-box {
        display: flex;
        flex-direction: column;
        justify-content: center;
        align-items: center;

        .day {
          width: 100%;
          height: 1rem;
          line-height: 1rem;
          text-align: center;
          font-size: 0.52rem;
          font-weight: bold;
          border-radius: 0.1rem;
        }
        .date {
          height: 1rem;
          line-height: 1rem;
          font-size: 0.4rem;
        }
        .jieqi {
          color: blue;
        }
        .jieri {
          color: red;
          font-family: "dyh";
          font-size: .5rem;
        }
      }
    }
  }
}
// PC端适配
@media screen and (min-width: 1119px) {
  .calendarsBox {
    width: 100%;
    height: 100%;
    font-family: "lgq";
    position: relative;
    font-size: 0.3rem;
    section {
      //上一年 下一年
      .btnBox {
        position: absolute;
        top: 0.23rem;
        right: 4rem;
        .el-button + .el-button {
          margin-left: 0;
        }
      }
    }
    ::v-deep .el-button {
      border: none;
    }
    ::v-deep .el-button:hover {
      color: #409eff;
      border-color: none;
      background-color: #dae6f5;
    }
    ::v-deep .el-calendar-table .el-calendar-day {
      display: flex;
      align-items: center;
      justify-content: center;
    }
    ::v-deep .el-calendar__body {
      padding: 0 0 0;
    }
    ::v-deep .el-calendar-table td.is-today {
      color: #409eff;
    }
    .conter {
      text-align: center;

      .c-box {
        display: flex;
        flex-direction: column;
        justify-content: center;
        align-items: center;

        .day {
          width: 100%;
          height: 0.6rem;
          line-height: 0.6rem;
          text-align: center;
          font-size: 0.42rem;
          font-weight: bold;
          border-radius: 0.1rem;
        }
        .date {
          height: 0.6rem;
          line-height: 0.6rem;
        }
        .jieqi {
          color: blue;
        }
        .jieri {
          color: red;
          font-family: "dyh";
        }
      }
    }
  }
}
</style>

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

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

相关文章

django 访问后台数据库管理程序报错:CSRF verihcation failed. Request aborted.

解决方案 在 settings.py 最后加上这个 CSRF_TRUSTED_ORIGINS ["https://<你自己 heroku 的项目部署地址>.herokuapp.com" ]注意下面的事项&#xff1a; https 前面和 .com 后面不要带空格&#xff0c;因为你在复制的时候可能引入空格.com 后面不要加斜杠&a…

【新书推荐】3.1节 布尔运算

本节内容&#xff1a;布尔运算&#xff0c;又称为逻辑运算或位运算。 ■布尔代数&#xff1a;and与、or或、not非、xor异或&#xff0c;按位运算。 3.1.1 布尔代数 ■布尔代数与二进制的关系 乔治布尔是一位英国小学数学老师&#xff0c;19世纪最重要的数学家之一。出版了《…

微信小程序开发学习笔记《13》WXS脚本

微信小程序开发学习笔记《13》WXS脚本 博主正在学习微信小程序开发&#xff0c;希望记录自己学习过程同时与广大网友共同学习讨论。建议仔细阅读对应官方文档 一、WXS介绍 WXS ( WeiXin Script)是小程序独有的一套脚本语言&#xff0c;结合WXML&#xff0c;可以构建出页面的…

IMU里程计

前言&#xff1a; IMU里程计和视觉里程计、激光里程计等一样&#xff0c;都可以独立计算里程计信息。求解IMU里程计的步骤可以简单的分为三个模块&#xff1a;IMU运动积分、IMU预积分、IMU初始化。 求解IMU里程计的流程参考自ORB&#xff1a;SLAM3。 IMU运动积分 IMU的运动…

java web mvc-04-Apache Wicket

拓展阅读 Spring Web MVC-00-重学 mvc mvc-01-Model-View-Controller 概览 web mvc-03-JFinal web mvc-04-Apache Wicket web mvc-05-JSF JavaServer Faces web mvc-06-play framework intro web mvc-07-Vaadin web mvc-08-Grails 开源 The jdbc pool for java.(java …

【学网攻】 第(12)节 -- 动态路由(RIP)

系列文章目录 目录 系列文章目录 文章目录 文章目录 前言 一、动态路由是什么&#xff1f; 二、实验 1.引入 总结 文章目录 文章目录 【学网攻】 第(1)节 -- 认识网络【学网攻】 第(2)节 -- 交换机认识及使用【学网攻】 第(3)节 -- 交换机配置聚合端口【学网攻】 第(4…

docker 入门,docker-compose 入门

1,什么是docker Docker 是一个开源的应用容器引擎&#xff0c;基于 Go 语言 并遵从Apache2.0协议开源。 注意他是一个开源得应用容器 引擎 &#xff0c;大家说docker容器&#xff0c;这不准确&#xff0c;应该回答是容器化技术&#xff0c;应用容器引擎。基于go 语言开发的。 …

多维时序 | Matlab实现DBO-GRU蜣螂算法优化门控循环单元多变量时间序列预测

多维时序 | Matlab实现DBO-GRU蜣螂算法优化门控循环单元多变量时间序列预测 目录 多维时序 | Matlab实现DBO-GRU蜣螂算法优化门控循环单元多变量时间序列预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现DBO-GRU蜣螂算法优化门控循环单元多变量时间序列预…

万字图解 | 深入揭秘HTTP工作原理

大家好&#xff0c;我是「云舒编程」&#xff0c;今天我们来聊聊计算机网络面试之-(应用层HTTP)工作原理。 文章首发于微信公众号&#xff1a;云舒编程 关注公众号获取&#xff1a; 1、大厂项目分享 2、各种技术原理分享 3、部门内推 前言 想必不少同学在面试过程中&#xff0…

华清远见作业第三十四天——C++(第三天)

思维导图&#xff1a; 题目&#xff1a; 设计一个Per类&#xff0c;类中包含私有成员:姓名、年龄、指针成员身高、体重&#xff0c;再设计一个Stu类&#xff0c;类中包含私有成员:成绩、Per类对象p1&#xff0c;设计这两个类的构造函数、析构函数和拷贝构造函数。 代码&#…

LabVIEW动态数据交换实现数据通信

LabVIEW动态数据交换实现数据通信 介绍了LabVIEW软件在驱动一般多功能接口卡中的应用。LabVIEW作为一种图形化编程平台&#xff0c;被广泛应用于自动测量系统、工业过程自动化等领域。利用LabVIEW驱动实验室中常用的多功能接口卡&#xff0c;以实现数据采集和分析。 系统主要…

通讯录项目(终)

Start And Stick 上一期我们将通讯录的项目的基本功能已经实现&#xff0c;这一篇文章我们将对通讯录进行完善。 目录 Start And Stick 上期回顾&#xff1a; 上期必要代码&#xff1a; 数据打印&#xff1a; 代码讲解&#xff1a; 头部插入数据&#xff1a; 代码讲解&…

黑马程序员-瑞吉外卖-day5

修改实体类 package com.itheima.reggie.entity;import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode;i…

常见の算法5

位图 一个int类型32字节&#xff0c;可以表示0-31这32个数出没出现过&#xff0c;出现过1没出现0&#xff0c;再扩大一点搞个数组&#xff0c;就可以表示0-1023出没出现过&#xff0c;一个long类型可储存64位 如何把10位组成的数&#xff0c;第四位由1改成零 package class05…

【深度学习:开源BERT】 用于自然语言处理的最先进的预训练

【深度学习&#xff1a;开源BERT】 用于自然语言处理的最先进的预训练 是什么让 BERT 与众不同&#xff1f;双向性的优势使用云 TPU 进行训练BERT 结果让 BERT 为您所用 自然语言处理 &#xff08;NLP&#xff09; 面临的最大挑战之一是训练数据的短缺。由于 NLP 是一个具有许多…

绿联私有云DX4600升级DX4600 Pro试用体验 | 全方位解读“卷王”NAS的进化史

哈喽小伙伴们好&#xff0c;我是Stark-C~ 想必很多关注数码圈的朋友都知道绿联这个品牌吧&#xff1f;作为一个深耕数码科技领域数十载的国民大品牌&#xff0c;绿联现在可谓是在数码行业全面开花&#xff0c;并且取得的成就大家也是有目共睹。它家的产品基本都是以高性价比著…

详解SpringCloud微服务技术栈:ElasticSearch实践1——RestClient操作索引库与文档

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位大四、研0学生&#xff0c;正在努力准备大四暑假的实习 &#x1f30c;上期文章&#xff1a;详解SpringCloud微服务技术栈&#xff1a;ElasticSearch原理精讲、安装、实践 &#x1f4da;订阅专栏&#xff1a;微服务技术全家…

C++ 数论相关题目 表达整数的奇怪方式(中国剩余定理)

给定 2n 个整数 a1,a2,…,an 和 m1,m2,…,mn &#xff0c;求一个最小的非负整数 x &#xff0c;满足 ∀i∈[1,n],x≡mi(mod ai) 。 输入格式 第 1 行包含整数 n 。 第 2…n1 行&#xff1a;每 i1 行包含两个整数 ai 和 mi &#xff0c;数之间用空格隔开。 输出格式 输出最小…

使用 create-react-app 创建 react 应用

一、创建项目并启动 第一步&#xff1a;全局安装&#xff1a;npm install -g create-react-app 第二步&#xff1a;切换到想创建项目的目录&#xff0c;使用命令create-react-app hello-react 第三步&#xff1a;进入项目目录&#xff0c;cd hello-react 第四步&#xff1a;启…

内部类 --java学习笔记

内部类 是类中的五大成分之一&#xff08;成员变量、方法、构造器、内部类、代码块&#xff09;&#xff0c;如果一个类定义在另一个类的内部&#xff0c;那么这个类就是内部类当一个类的内部包含了一个整体的事务&#xff0c;且这个事务没必要单独设计时&#xff0c;就可以把…