vue实现日历
vue实现日历
之前在上家公司做过一个公司人员考勤的东西,里面需要用到日历,当时自己用vue随便写了一个,比较简单
下面代码是删掉了其他功能的代码,只留下日历部分
<template>
<div class="lookForMonth_wrapper">
<div class="lookForMonth_top">
<div class="selectDate">
<div>{{year}} 年 {{month}} 月</div>
<div class="upDownSelect">
<div class="upDownSelect_item" @click="dateUp"></div>
<div class="upDownSelect_item" @click="dateDown"></div>
</div>
</div>
</div>
<div class="calendar" :style="calendarStyle">
<div v-for="(item,index) in calendarData" class="calendar_item" :key='index' :class="{ash:item.color==='ash',date:index>6&&item.color!=='ash'}">
<p class="dateEdit">{{item.label}}<i class="el-icon-edit-outline" v-if="item.color!=='ash'&&index>=7"></i></p>
<p v-if='index>6'>上班</p> // 打工人
</div>
</div>
</div>
</template>
<script>
export default {
name: "lookForMonth",
data: () => {
return {
calendarData: [{label:"日"},{label: "一"}, {label:"二"},{label: "三"},{label: "四"},{label: "五"},{label: "六"}], //日历循环渲染数据
year: 0, //当前日期年
month: 0, //当前日期月数
date: 0, //当前日期号数
day: -1, //当前星期几
};
},
filters:{
},
computed: {
// 根据当月日期详情更改日历表格高度
calendarStyle() {
if (this.calendarData.length > 42) {
return "height: 701px;";
} else {
return "height: 601px;";
}
}
},
async created(){
// 获取当前日期数据
this.getNow();
// 获取当前月份一号的时间戳
let firstTime = +new Date(this.year,this.month-1,1,0,0,0)
this.getCalendarDate(); // 给calendarData添加当月数据
},
mounted() {
},
methods: {
// 获取当前时间
getNow() {
let now = new Date()
this.year = +now.getFullYear()
this.month = +now.getMonth() + 1
this.date = +now.getDate()
this.day = +now.getDay()
},
// 获取每个月的天数
monthDay(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
}
}
},
// 给calendarData添加当月数据
getCalendarDate() {
// 获取当前月份一号星期几
let firstDay = new Date(this.year + "-" + this.month + "-" + "01").getDay();
this.calendarData = [{label:"日"},{label: "一"}, {label:"二"},{label: "三"},{label: "四"},{label: "五"},{label: "六"}];
let num = parseInt(firstDay);
let nowDays = this.monthDay(this.month);
let lastMonth = this.month - 1>0?this.month - 1:12;
let lastDays = this.monthDay(lastMonth);
// 循环添加上一个月数据
for (let i = 0; i < num; i++) {
this.calendarData.push({label:lastDays - num + i + 1,color:'ash'});
}
// 循环添加当月数据
for (let i = 0; i < nowDays; i++) {
this.calendarData.push({label:i + 1});
}
// 循环添加下一个月数据
if (this.calendarData.length % 7 !== 0) {
let surplusDay = 7 - (this.calendarData.length % 7);
for (let i = 0; i < surplusDay; i++) {
this.calendarData.push({label:i + 1,color:'ash'});
}
}
this.loading = false
},
// 将日期调上
dateUp() {
this.month--;
if (this.month <= 0) {
this.year--;
this.month = 12;
}
this.getCalendarDate(); // 给calendarData添加当月数据
},
// 将日期调下
dateDown() {
this.month++;
if (this.month > 12) {
this.year++;
this.month = 1;
}
this.getCalendarDate(); // 给calendarData添加当月数据
},
}
};
</script>
<style lang="scss" scoped>
.lookForMonth_wrapper {
padding: 20px;
width: 701px;
margin: auto;
}
.lookForMonth_top {
margin-bottom: 20px;
overflow: hidden;
.selectTeacher {
float: left;
}
.selectDate {
height: 30px;
line-height: 30px;
float: right;
display: flex;
.upDownSelect {
display: flex;
flex-direction: column;
margin-top: -2px;
margin-left: 5px;
.upDownSelect_item {
width: 0;
height: 0;
border: 7px solid transparent;
cursor: pointer;
}
.upDownSelect_item:nth-child(1) {
border-bottom: 7px solid #666;
margin-bottom: 5px;
&:hover {
border-bottom: 7px solid skyblue;
}
}
.upDownSelect_item:nth-child(2) {
border-top: 7px solid #666;
&:hover {
border-top: 7px solid skyblue;
}
}
}
}
}
/* 日历表样式=======================================↓ */
.calendar {
width: 701px;
border-top: 1px solid #ccc;
border-left: 1px solid #ccc;
display: flex;
flex-wrap: wrap;
box-sizing: border-box;
.calendar_item {
box-sizing: border-box;
width: 100px;
height: 100px;
border-right: 1px solid #ccc;
border-bottom: 1px solid #ccc;
text-align: center;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
&.date:hover{
background: #eee;
}
.status{
margin-top: 10px;
&.textBlue{
color: blue;
}
&.textRed{
color: brown;
}
}
.el-icon-edit-outline{
cursor: pointer;
margin-left: 7px;
}
}
.ash{
color: gainsboro;
}
.dateEdit{
margin-bottom: 10px;
}
}
</style>
效果如下:

vue实现日历的更多相关文章
- Vue自定义日历组件
今天给大家介绍Vue的日历组件,可自定义样式.日历类型及支持扩展,可自定义事件回调.Props数据传输. 线上demo效果 示例 Template: <Calendar :sundayStart ...
- 使用ant design vue的日历组件,实现一个简单交易日与非交易日的切换
使用ant design vue的日历组件,实现一个简单交易日与非交易日的切换 需求: 日历区分交易日.非交易日 可以切换面板查看整年交易日信息 可以在手动调整交易日.非交易日 演示实例 序--使用软 ...
- vue初学实践之路——vue简单日历组件(1)
---恢复内容开始--- 最近做的项目有一个需求,需要有一个日历组件供预定功能使用,之前的代码过于繁琐复杂,所以我采用vue重写了这个组件. npm.vue等等安装. 只是一个简单的日历组件,所以并不 ...
- vue初学实践之路——vue简单日历组件(3)
这一篇我们来实现管理员修改每一天剩余数量的功能. <div id="calendar"> <div id="left"> <spa ...
- vue初学实践之路——vue简单日历组件(2)
上一篇我们已经实现了基本的日历显示功能,这一次我们要加上预定的功能 废话不多说,上代码 <div id="calendar"> <!-- 年份 月份 --> ...
- vue自定义日历组件的实现
实现一个日期组件,如图: components.js代码如下: Vue.component('sc-calendar',{ template:'<div class="scCalend ...
- vue 自定义日历组件
<template> <div class=""> <div class="calendarTraffic" name=" ...
- 一个vue的日历组件
说明: 1.基于element-ui开发的vue日历组件. 地址 更新: 1.增加value-format指定返回值的格式2.增加头部插槽自定义头部 <ele-calendar > < ...
- vue - 小日历项目制作中的问题与解决思路
效果图: 项目难点: 1. 每个月的日期数是不定的,拢共需要几个格子? 按照教程的做法需要42个.所以遍历数字42,得到42个div做格子. 2. 格子的排版怎么做? 顶部的星期布局使用的flex水平 ...
随机推荐
- HTML a Tag All In One
HTML a Tag All In One HTML <a> target https://developer.mozilla.org/en-US/docs/Web/HTML/Elemen ...
- js array contains All In One
js array contains All In One includes & contains & has Array.prototype.contains "use st ...
- 1+X 证书制度
1+X 证书制度 教育部职业技术教育 http://www.cvae.com.cn/zgzcw/tzgg/202001/c0ddd6c87e6c42839f8cc3e09a2dce89.shtml 2 ...
- GitHub SSH key
GitHub SSH key https://help.github.com/en/github/authenticating-to-github steps HTTPS clone !== SSH ...
- 微信小程序-显示外链图片 bug
微信小程序-显示外链图片 bug 显示外链图片 bug 403 bug 禁止外链,未授权 https://httpstatuses.com/403 image component 图片.支持 JPG. ...
- Web SQL& IndexedDB
Web SQL& IndexedDB https://developer.mozilla.org/en/docs/Web/API/IndexedDB_API https://mdn.githu ...
- 死磕Spring之IoC篇 - 调试环境的搭建
该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读 Spring 版本:5.1. ...
- Python3+pygame实现的俄罗斯方块 代码完整 有演示效果
一.简单说明 80.90后的小伙伴都玩过"俄罗斯方块",那种"叱咤风云"场景 偶尔闪现在脑海 真的是太爽了:如果没有来得及玩过的同学,这次可以真正的自己做一个了 ...
- Mybatis检查SQL注入
Mybatis 的 Mapper.xml 语句中 parameterType 向SQL语句传参有两种方式:#{ } 和 ${ }. 使用#{ }是来防止SQL注入,使用${ }是用来动态拼接参数. 如 ...
- SpringMVC-01 什么是SpringMVC
SpringMVC-01 什么是SpringMVC 回顾MVC 1.什么是MVC MVC是模型(Model).视图(View).控制器(Controller)的简写,是一种软件设计规范. 是将业务逻辑 ...