本文实例为大家分享了vue3.0实现考勤日历组件使用的具体代码,供大家参考,具体内容如下

自定义日历组件,首先我们要明确需求与面板展示内容

1、周日~周六。
2、当前月日历1~(28/29/30/31),当前月1号如果不是周日,需要上月最后日历补全,当月最后一天不是周六需要下月开始日历补全。
3、切换至上月,切换至下月按钮
4、当前年月展示
5、如果某日有考勤异常,考勤异常日期标记
6、当前日期展示展示为‘今’
7、点击上月日期切换至上月面板并选中该日期弹出该日期考勤信息
8、点击下月日期切换至下月面板并选中该日期弹出该日期的考勤信息
9、点击当前月日期则选中当前日期并弹出该日期的考勤信息

首先日历面板实现

HTML结构如下

<ul class="week">
      <li>日</li>
      <li>一</li>
      <li>二</li>
      <li>三</li>
      <li>四</li>
      <li>五</li>
      <li>六</li>
    </ul>
    <ul class="dateList">
      <li
        v-for="item in dateList.List"
        @click="intraday(item, item.date)"
        :class="item.class"
        :date="item.date"
        :key="item"
      >
        <div>{{ item.text }}</div>
        <i></i>
      </li>
    </ul>

其中dateList为我们js计算出的当前面板应该展示的日历数组对象(包括上月的日期、当月日期和下月日期),item.class为当前日期展示样式的类名(包括上月日期样式‘upMonth’,下月日期样式‘lastMonth’,假日样式‘Holiyday’,选中样式‘selected’,今天样式‘today’,请假样式‘leave’,考勤异常样式‘absent’),item.date为日期(xxxx-xx-xx),item.text为当前日,今天展示为‘今’,‘<i></i>’标签用于展示考勤异常和请假,intraday方法为点击某日

面板渲染方式,实现dateList数组的计算

const MonthDay = ref([31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]); //确定每月天数
const calendar = (n, seletDay) => { 
        //n为0表示当月,n为-1表示上月,n为1表示下月,seletDay默认选中日期
      var oDate = new Date(); //定义时间
      oDate.setMonth(oDate.getMonth()   n); //设置月份,
      year.value = oDate.getFullYear(); //年,获取当前年份
      month.value = oDate.getMonth(); //月,获取当前月份(0-11)
      var allDay = MonthDay.value[month.value]; //计算本月有多少天
      var upMonthDay = MonthDay.value[month.value == 0 ? 11 : month.value - 1];//计算上个月有多少天
      //判断闰年,如果是闰年的2月份,当月总天数为29天
      if (month.value == 1) {
        if (
          (year.value % 4 == 0 && year.value % 100 != 0) ||
          year.value % 400 == 0
        ) {
          allDay = 29;
        }
      }
      //判断本月第一天是星期几
      oDate.setDate(1); //时间调整到本月第一天
      var weekStar = oDate.getDay(); //读取本月第一天是星期几
      oDate.setDate(allDay); //时间调整到本月最后一天
      var weekEnd = oDate.getDay(); //读取本月最后一天是星期几
      var dateArry = [];
      //上月日期插入数组
      for (var j = upMonthDay - weekStar; j < upMonthDay; j  ) {
        let obj = {
          class: ["upMonth"],  
          date:
            year.value  
            "-"  
            (month.value < 10 ? "0" : "")  
            (month.value   1 - 1)  
            "-"  
            (j < 9 ? "0" : "")  
            (j   1),
          text: j   1,
          day: j   1,
        };
        dateArry.push(obj);
      }
      //当月日期插入到dateList
      for (var i = 1; i <= allDay; i  ) {
        let obj = {
          class: [],
          date:
            year.value  
            "-"  
            (month.value < 9 ? "0" : "")  
            (month.value   1)  
            "-"  
            (i < 10 ? "0" : "")  
            i,
          text: i,
          day: i,
        };
 
        //判断是否当月(非当月)
        if (
          year.value != today.getFullYear() ||
          month.value != today.getMonth()
        ) {
          if (seletDay && seletDay != "n") { //存在默认选中日期时
            if (i == seletDay) {
              obj.class.push("selected"); //默认选中传入日期
              upitem = obj;
            }
          } else if (i == 1) { //没有默认选中日期时默认选中1号
            //判断是否是1号
            obj.class.push("selected"); //默认选中1号
            upitem = obj;
          }
        }else { //(当月)
          // 判断是否当天
         if (format(today) == obj.date) { //(当天)
            obj.class.push("today");
            obj.text = "今";
            if(!seletDay || seletDay == "n"){ //没有默认选中日期时默认选中‘今天'
               obj.class.push("selected");
               upitem = obj;
            }
          }else{
              if (seletDay && seletDay != "n") { //非当天
                if (i == seletDay) {
                  obj.class.push("selected"); //默认选中传入日期
                  upitem = obj;
                }
              }
          }
        }
 
        if (findDate(monthDate, 'perday', obj.date)!=-1) { 
          var k = findDate(monthDate, 'perday', obj.date); 
          //判断是否节假日
          if (monthDate[k].isworkday == "否") {
            obj.class.push("Holiyday");
          } else if (  //判断考勤异常
            monthDate[k].attendflags != "迟到"
          ) {
            obj.class.push("absent");
          } else if (
            //判断请假
            monthDate[k].leaveflags == "请假" 
          ) {
            obj.class.push("leave");
          }
        }
        dateArry.push(obj);
      }
      //下月日期插入到dateList
      for (var k = 1; k <= 6 - weekEnd; k  ) {
        let obj = {
          class: ["lastMonth"],
          date:
            year.value  
            "-"  
            (month.value < 8 ? "0" : "")  
            (month.value   1   1)  
            "-"  
            (k < 10 ? "0" : "")  
            k,
          text: k,
          day: k,
        };
        dateArry.push(obj);
      }
      dateList.List = dateArry;
    };

上月、下月切换按钮点击实现

html部分:

<div class="calendarTitle">
      <-- 切换至上月-->
      <img
        class="upMonth"
        src="../assets/images/up.png"
        @click="upMonth('n')"  //传入‘n'表示没有默认选中
      />
      <h4>
        <span>{{ month   1 }}月</span> <span>{{ year }}年</span>
      </h4>
       <-- 切换至下月-->
      <img
        class="lastMonth"
        src="../assets/images/last.png"
        @click="lastMonth('n')"  //传入‘n'表示没有默认选中
      />
</div>

js部分:

//  向上翻月
    const upMonth = (day) => {
      monthDate = "";
      total.obj = "";
      normally.value = true;
      calendar(--iNow, day);
    };
    //  向下翻月
    const lastMonth = (day) => {
      monthDate = "";
      total.obj = "";
      normally.value = true;
      calendar(  iNow, day);
    };

点击某日intraday方法

// 点击日历图上某天
    const intraday = async (item, date) => {
      if (item.class.indexOf("upMonth") > -1) { //如果点击的是上月日期则切换到上月日历面板
        upMonth(item.day);
        return;
      }
      if (item.class.indexOf("lastMonth") > -1) {//如果点击的是下月日期则切换到下月日历面板
        lastMonth(item.day);
        return;
      }
       
      //点击当前月日期  
      upitem.class[upitem.class.indexOf("selected")] = null; //上次点击日期去除选中样式
      item.class.push("selected");  //当前点击日期加上选中样式
      upitem = item;
    };

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持Devmax。

vue3.0实现考勤日历组件使用详解的更多相关文章

  1. Vue如何指定不编译的文件夹和favicon.ico

    这篇文章主要介绍了Vue如何指定不编译的文件夹和favicon.ico,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  2. 无法以编程方式从Android日历中读取重复发生的事件

    p=151&cpage=2#comment-52767来访问内部的android日历数据库.它适用于除重复活动之外的所有条目.光标根本不会返回任何重复发生的事件.有人可以帮助我吗?p=151例:编辑:谷歌似乎开始记录日历提供商.浏览到CalendarProvidier|GoogleDevelopers以获取更多信息.

  3. vue自定义加载指令v-loading占位图指令v-showimg

    这篇文章主要为大家介绍了vue自定义加载指令和v-loading占位图指令v-showimg的示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. vue使用动画实现滚动表格效果

    这篇文章主要为大家详细介绍了vue使用动画实现滚动表格效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  5. 关于Vue 监控数组的问题

    这篇文章主要介绍了Vue 监控数组的示例,主要包括Vue 是如何追踪数据发生变化,Vue 如何更新数组以及为什么有些数组的数据变更不能被 Vue 监测到,对vue监控数组知识是面试比较常见的问题,感兴趣的朋友一起看看吧

  6. Vue子组件props从父组件接收数据并存入data

    这篇文章主要介绍了Vue子组件props从父组件接收数据并存入data的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  7. Vue h函数的使用详解

    本文主要介绍了Vue h函数的使用详解,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  8. VUE响应式原理的实现详解

    这篇文章主要为大家详细介绍了VUE响应式原理的实现,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助

  9. vue+Element ui实现照片墙效果

    这篇文章主要为大家详细介绍了vue+Element ui实现照片墙效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. vue+elemet实现表格手动合并行列

    这篇文章主要为大家详细介绍了vue+elemet实现表格手动合并行列,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

随机推荐

  1. js中‘!.’是什么意思

  2. Vue如何指定不编译的文件夹和favicon.ico

    这篇文章主要介绍了Vue如何指定不编译的文件夹和favicon.ico,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  3. 基于JavaScript编写一个图片转PDF转换器

    本文为大家介绍了一个简单的 JavaScript 项目,可以将图片转换为 PDF 文件。你可以从本地选择任何一张图片,只需点击一下即可将其转换为 PDF 文件,感兴趣的可以动手尝试一下

  4. jquery点赞功能实现代码 点个赞吧!

    点赞功能很多地方都会出现,如何实现爱心点赞功能,这篇文章主要为大家详细介绍了jquery点赞功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  5. AngularJs上传前预览图片的实例代码

    使用AngularJs进行开发,在项目中,经常会遇到上传图片后,需在一旁预览图片内容,怎么实现这样的功能呢?今天小编给大家分享AugularJs上传前预览图片的实现代码,需要的朋友参考下吧

  6. JavaScript面向对象编程入门教程

    这篇文章主要介绍了JavaScript面向对象编程的相关概念,例如类、对象、属性、方法等面向对象的术语,并以实例讲解各种术语的使用,非常好的一篇面向对象入门教程,其它语言也可以参考哦

  7. jQuery中的通配符选择器使用总结

    通配符在控制input标签时相当好用,这里简单进行了jQuery中的通配符选择器使用总结,需要的朋友可以参考下

  8. javascript 动态调整图片尺寸实现代码

    在自己的网站上更新文章时一个比较常见的问题是:文章插图太宽,使整个网页都变形了。如果对每个插图都先进行缩放再插入的话,太麻烦了。

  9. jquery ajaxfileupload异步上传插件

    这篇文章主要为大家详细介绍了jquery ajaxfileupload异步上传插件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. React学习之受控组件与数据共享实例分析

    这篇文章主要介绍了React学习之受控组件与数据共享,结合实例形式分析了React受控组件与组件间数据共享相关原理与使用技巧,需要的朋友可以参考下

返回
顶部