vue实现打卡功能

本文实例为大家分享了vue实现打卡功能的具体代码,供大家参考,具体内容如下

记录使用vue实现移动端日历打卡样式

template
compareToNow:与当前时间比较
-1:小于当前时间
0:今天
1:大于当前时间

<!-- @click="todo" 实现打卡功能 --> <div v-if="compareToNow(item) === 1" @click="todo">{{ item.date }}</div> <!-- @click="todo" 实现补卡功能 -->  <div v-if="compareToNow(item) === -1" @click="todo" class="otherDay"> <template>   <div>     <div class="top-title">       <div><span @click="lastMonth" class="link">⋘</span></div>       <div><span>{{year}}年{{month}}月</span></div>       <div><span @click="nextMonth" class="link">⋙</span></div>     </div>     <div class="container" style="border-bottom: 1px solid #cccccc">       <div v-for="(item,index) in weeks" :key="index">{{ item }}</div>     </div>     <div class="container" style="padding: 1vh 1vh 3vh 1vh;">       <div v-for="(item,index) in data" :key="index">         <div v-if="compareToNow(item) === 0" style="color: #2d8cf0">{{ item.date }}</div>         <div v-if="compareToNow(item) === 1">{{ item.date }}</div>         <div v-if="compareToNow(item) === -1" class="otherDay">           <div>{{ item.date }}</div>           <div class="date-desc">补卡</div>         </div>       </div>     </div>   </div> </template>

script

<script> export default {   data() {     return {       today:new Date(),       now:new Date(),       weeks:["日","一","二","三","四","五","六"],       year:"",       month:"",       date:"",       firstDay:"",       data:[],     };   },   mounted() {     this.getNow();   },   methods:{     getNow(){       this.year = this.now.getFullYear();       this.month = this.now.getMonth() + 1;       this.date = this.now.getDate();       this.now.setDate(1);       this.firstDay = this.now.getDay();       this.initData();     },     getMonthDay(month){       if ([1,3,5,7,8,10,12].includes(month)) {         return 31       } else if ([4,6,9,11].includes(month)) {         return 30       } else if (month === 2) {         //  判断当年是否为闰年         if (           (this.year % 4 === 0 && this.year % 100 !== 0) ||           this.year % 400 === 0         ) {           return 29         } else {           return 28         }       }     },     initData(){       this.data = [];       let days = this.getMonthDay(this.month);       for (let i = 0; i < this.firstDay; i++) {         this.data.push({           year:"",           month:"",           date:"",         });       }       for (let i = 0; i < days; i++) {         this.data.push(           {             year: this.year,             month: this.month,             date: i + 1,           }         );       }     },     lastMonth(){       this.now.setMonth(this.now.getMonth() - 1);       this.getNow();     },     nextMonth(){       this.now.setMonth(this.now.getMonth() + 1);       this.getNow();     },     compareToNow(item){       if (item.year && item.month && item.date) {         let date1 = new Date();         date1.setFullYear(item.year)         date1.setMonth(item.month - 1)         date1.setDate(item.date)         date1.setHours(0)         date1.setMinutes(0)         date1.setSeconds(0)         let now = new Date();         now.setHours(0)         now.setMinutes(0)         now.setSeconds(0)         if (date1.getTime() > now.getTime()){           return 1         }else if (date1.getTime() === now.getTime()){           return 0         }else if (date1.getTime() < now.getTime()){           return -1         }       }     }   } } </script>

style

/* 背景图片 background:url  和 background-size 可注释 */ <style scoped lang="less">   .top-title{     display: grid;     grid-template-columns:repeat(3,1fr);     grid-auto-rows:40px;     grid-gap:1rem;     background-color: #FFFFFF;     border-bottom: 1px solid #cccccc;     line-height: 40px;   }   .container{     display: grid;     grid-template-columns:repeat(7,1fr);     grid-auto-rows:40px;     grid-gap:1rem;     background-color: #FFFFFF;     line-height: 40px;     div{       text-align: center;     }   }   .today{     background: url("../assets/circle_success.webp") no-repeat center center;     background-size: 95% 95%;     position: relative;   }   .otherDay{     background: url("../assets/circle_error.webp") no-repeat center center;     background-size: 95% 95%;     position: relative;   }   .link{     font-size: 14px;     color: #2d8cf0;   }   .date-desc{     display: block;     position: absolute;     top: 6.8vw;     left: 1.5vw;     font-size: 2.3vw;     color: green;   } </style>

推荐阅读

    vue项目一些常见问题

    vue项目一些常见问题,组件,样式,**样式污染问题**同样的样式不需要在每个组件都复制组件内单独的样式加外层class包裹。加scope。否则只是

    01-Vue项目实战-网易云音乐-准备工作

    01-Vue项目实战-网易云音乐-准备工作,网易,项目,前言在接下来的一段时间,我会仿照网易云音乐,利用Vue开发一个移动端的网易云音乐项目。在做

    01- 第一天 spring boot2.3.1 +vue3.0 后台管理系统的研发

    01- 第一天 spring boot2.3.1 +vue3.0 后台管理系统的研发,自己的,后台,后台框架一直想开发一套完全属于自己的后台,但是18年的时候,曾经答

    Vue项目中 App.vue文件

    Vue项目中 App.vue文件,文件,内容, 在App.vue文件中,定义了一个id为app的div,在这个div板块中放置Helloworld组件,文件内容如下图所示:在

    1-Vue构造函数的生成

    1-Vue构造函数的生成,函数,属性,版本:@2.6.10环境:web ;思维图:www.processon.com/view/link/5…我们使用的Vue是一个经过层层加强的构造函数

    vue的跨域是什么意思

    vue的跨域是什么意思,跨域,浏览器,代理,请求,服务器,同源策略,在vue中,跨域是指浏览器不能执行其他网站的脚本;它是浏览器同源策略造成的,是浏览器

    Vue中如何实现表单验证

    Vue中如何实现表单验证,验证,表单验证,表单,用户名,元素,指令,随着web应用的不断发展,表单验证逐渐成为web开发过程中不可或缺的一部分。在Vue中

    用vue框架有什么好处

    用vue框架有什么好处,组件,项目,数据,优化,操作,框架,用vue的好处:1、Vue是组件化开发,减少代码的书写,使代码易于理解;2、可以对数据进行双向绑定;3

    Vue中的路由懒加载

    Vue中的路由懒加载,组件,路由,应用程序,懒加载,导入,函数,随着Web应用程序的复杂性不断增加,前端框架和库的使用也越来越广泛。Vue是一种流行的J

    vue路由模式有哪些

    vue路由模式有哪些,模式,浏览器,路由,请求,刷新,服务器,vue路由模式有:1、hash模式,使用URL的hash值来作为路由,支持所有浏览器;其url路径会出现“#

    如何封装组件vue

    如何封装组件vue,组件,函数,封装,复用,组件开发,维护,Vue 是一种流行的 JavaScript 框架,它可以帮助开发者快速构建交互式的 Web 应用。Vue 的一

    vue如何实现页面跳转

    vue如何实现页面跳转,页面跳转,新窗口,方法,标签,属性,函数,vue实现页面跳转的方法:1、通过<vue-link>标签实现新窗口打开;2、通过在单击事件或者