Vue生成日历,根据返回值将日期标红

HTML:

<h1>CSS 日历</h1>
<div id="calendar">
<div class="month">
<ul>
<!-- <li class="arrow" @click="pickPre(currentYear,currentMonth)">❮</li> -->
<li class="year-month" @click="pickYear(currentYear,currentMonth)">
<span class="choose-year">{{ currentYear +'/'+currentMonth}}</span>
<!-- <span class="choose-month">{{ currentMonth }}</span> -->
</li>
<!-- <li class="arrow" @click="pickNext(currentYear,currentMonth)">❯</li> -->
</ul>
</div>
<ul class="weekdays">
<li>一</li>
<li>二</li>
<li>三</li>
<li>四</li>
<li>五</li>
<li style="color:red">六</li>
<li style="color:red">日</li>
</ul>
<ul class="days">
<li @click="pick(day)" v-for="day in days">
<!--今天-->
<span v-if="day.getMonth()+1 != currentMonth" class="other-month">{{ day.getDate() }}</span>
<span v-else>
<!--今天-->
<span :class="{active:j(day.getFullYear(),day.getMonth()+1,day.getDate())}">{{ day.getDate() }}</span>
<!-- <span v-if="day.getFullYear() == new Date().getFullYear() && day.getMonth() == new Date().getMonth() && day.getDate() == new Date().getDate()" class="active">{{ day.getDate() }}</span> -->
<!-- <span v-else>{{ day.getDate() }}</span> -->
</span>
</li>
</ul>
</div>
 
 
css:
<style type="text/css">
* {
box-sizing: border-box;
}
 
ul {
list-style-type: none;
}
 
body {
font-family: Verdana, sans-serif;
background: #E8F0F3;
}
 
#calendar {
width: 560px;
height: 400px;
margin: 0 auto;
border: 2px solid #000;
background: #fafafa;
}
 
.month {
width: 100%;
height: 60px;
}
 
.year-month {
height: 60px;
text-align: center;
line-height: 60px;
font-size: 26px;
}
 
.weekdays {
margin: 0;
padding: 6px 20px;
background-color: #f2f2f2;
display: flex;
color: #333;
justify-content: space-around;
}
 
.weekdays li {
display: inline-block;
width: 40px;
height: 40px;
text-align: center;
line-height: 40px;
font-size: 18px;
font-weight: bold;
}
 
.days {
padding: 15px 20px;
background: #FFFFFF;
margin: 0;
display: flex;
flex-wrap: wrap;
justify-content: space-around;
}
 
.days li {
list-style-type: none;
display: inline-block;
width: 14.2%;
text-align: center;
padding: 4px 0;
font-size: 16px;
color: #000;
}
 
.days li .active {
border-radius: 50%;
background: red;
color: #fff;
}
 
.days li span {
display: inline-block;
width: 40px;
height: 40px;
line-height: 40px;
font-weight: bold;
}
 
.days li .other-month {
color: gainsboro;
}
 
.days li:hover {
background: #e1e1e1;
}
</style>
 
javascript:
 
<script type="text/javascript">
new Vue({
el: '#calendar',
data: {
currentDay: 1,
currentMonth: 1,
currentYear: 1970,
currentWeek: 1,
days: [],
addDay: [],
},
created: function() {
this.initData(null);
var $this = this;
//请求数据
$.ajax({
url: "这里填接口名称",
type: "POST",
data: {
name: '',
params: ''
},
dataType: "json",
async: false,
success: function(data) {
console.log(data);
$this.addDay = data;
},
error: function(xhr) {
console.log(xhr);
}
});
},
methods: {
j: function(y, m, d) {
//将传入的参数转换成字符串,作比较
var Y = y.toString();
var M = m < 10 ? '0' + m : m.toString();
var D = d < 10 ? '0' + d : d.toString();
//判断日历日期跟数据返回日期做对比
for (var i = 0; i < this.addDay.length; i++) {
if (toData(this.addDay[i]['日历日期']) == (Y + M + D)) {
return true
}
}
function toData(date) { //将时间戳转化成标准的日期格式
if (date == null) {
return "";
}
var ndate = new Date(date);
var Y = ndate.getFullYear();
var M = (ndate.getMonth() + 1 < 10 ? '0' + (ndate.getMonth() + 1) : ndate.getMonth() + 1);
var D = (ndate.getDate() < 10 ? '0' + (ndate.getDate()) : ndate.getDate());
ndate = Y + M + D;
return ndate;
}
},
initData: function(cur) {
var date;
if (cur) {
date = new Date(cur);
} else {
date = new Date();
}
this.currentDay = date.getDate();
this.currentYear = date.getFullYear();
this.currentMonth = date.getMonth() + 1;
this.currentWeek = date.getDay(); // 1...6,0
if (this.currentWeek == 0) {
this.currentWeek = 7;
}
var str = this.formatDate(this.currentYear, this.currentMonth, this.currentDay);
// console.log("today:" + str + "," + this.currentWeek);
this.days.length = 0;
// 今天是周日,放在第一行第7个位置,前面6个
for (var i = this.currentWeek - 1; i >= 0; i--) {
var d = new Date(str);
d.setDate(d.getDate() - i);
// console.log("y:" + d.getDate());
this.days.push(d);
}
for (var i = 1; i <= 35 - this.currentWeek; i++) {
var d = new Date(str);
d.setDate(d.getDate() + i);
this.days.push(d);
}
},
pick: function(date) {
alert(this.formatDate(date.getFullYear(), date.getMonth() + 1, date.getDate()));
},
pickPre: function(year, month) {
// setDate(0); 上月最后一天
// setDate(-1); 上月倒数第二天
// setDate(dx) 参数dx为 上月最后一天的前后dx天
var d = new Date(this.formatDate(year, month, 1));
d.setDate(0);
this.initData(this.formatDate(d.getFullYear(), d.getMonth() + 1, 1));
},
pickNext: function(year, month) {
var d = new Date(this.formatDate(year, month, 1));
d.setDate(35);
this.initData(this.formatDate(d.getFullYear(), d.getMonth() + 1, 1));
},
pickYear: function(year, month) {
alert(year + "," + month);
},
// 返回 类似 2016-01-02 格式的字符串
formatDate: function(year, month, day) {
var y = year;
var m = month;
if (m < 10) m = "0" + m;
var d = day;
if (d < 10) d = "0" + d;
return y + "-" + m + "-" + d
},
}
});
</script>
 

Vue日历的更多相关文章

  1. 多功能版vue日历控件

    下载地址:https://pan.baidu.com/s/1nvpx0tB5cIvvqHuApz_MpQ 之前写了一个简单的vue日历控件:https://www.cnblogs.com/mrzhu/ ...

  2. vue 日历组件只显示本月和下个月 -- 多选日期

    效果就是上图 代码贴出 1.在components > calander > index.vue <template> <div class="page&quo ...

  3. vue日历/日程提醒/html5本地缓存

    先上图 功能: 1.上拉日历折叠,展示周 2.左右滑动切换月 2.“今天”回到今天:“+”添加日程 3.localStorage存储日程 index,html <body> <div ...

  4. vue 日历组件

    Github 上很多点击弹出日历选择某个时间的组件,却没有找到单纯展示日历并且能点击获取时间的组件 npm i vue-calendar-component --save cnpm i vue-cal ...

  5. vue自定义日期选择,类似美团日期选择,日历控件,vue日历区间选择

    一个日历的控件,基于vue的,可以日历区间选择,可用于酒店日历区间筛选,动手能力强,可以修改成小程序版本的,先上效果图 里面的颜色样式都是可以修改的 选择范围效果 话不多说,直接上干货,代码可以直接复 ...

  6. vue日历控件,自定义选择年月 选择年月日 选择年月日时 选择年月日时分,自定义日期范围

    下载地址:https://pan.baidu.com/s/1iEZl4kDkEg4ybwqc7aI7vQ 注:功能更加全面的日历控件请访问:https://www.cnblogs.com/mrzhu/ ...

  7. Vue日历组件的功能

    本来呢,开开心心的写完了这个功能,然后发现elemeng更新了,增加了日历组件这个功能 我的内心机器奔溃,但是,element的日历组件太简单了,我感觉还是手撸一个吧,毕竟也不是很难 实现了显示农历, ...

  8. VUE 日历签到

    <style lang="scss"> @import "../assets/css/px2rem.scss"; .sign-box { width ...

  9. vue日历(纯 js,没用任何插件和组件)

    效果图: 代码:   <template> <div class="calender"> <div class="top"> ...

随机推荐

  1. Pig FOREACH 嵌套循环

    Example: Nested Block Suppose we have relations A and B. Note that relation B contains an inner bag. ...

  2. 微观SOA:服务设计原则及其实践方式

    大 量互联网公司都在拥抱SOA和服务化,但业界对SOA的很多讨论都比较偏向高大上.本文试图从稍微不同的角度,以相对接地气的方式来讨论SOA, 集中讨论SOA在微观实践层面中的缘起.本质和具体操作方式, ...

  3. HTML5秘籍(第2版) 中文pdf扫描版

      HTML5秘籍(第2版)共包括四个部分,共13章.第一部分介绍了HTML5的发展历程,用语义元素构造网页,编写更有意义的标记,以及构建更好的Web表单.第二部分介绍了HTML5中的音频与视频.CS ...

  4. IPMITOOL 配置BMC用户设置

    IPMITOOL 配置BMC用户设置 本文档共介绍5条ipmi设置user的命令,这些命令需要使用root权限才能使用,其中- H为需要操作的BMC ip,-I lanplus为使用rmcp+协议发送 ...

  5. HTML5学习笔记(七)WebSocket

    WebSocket是HTML5开始提供的一种在单个 TCP 连接上进行全双工通讯的协议.在WebSocket API中,浏览器和服务器只需要做一个握手的动作 浏览器通过 JavaScript 向服务器 ...

  6. windows下编译Boost库

    下载源码 boost_1_66_0.7z 生成编译工具 D:\Project\boost_1_66_0> bootstrap.bat 配置Python环境变量(使用VS2017自带的32位pyt ...

  7. remap——ROS中修改订阅的节点名称

    跑数据集或者使用不同传感器时,难免会遇到需要修改topic名称的时候,此时可以有两种做法. 一.直接修改源码.如果有launch文件,则修改launch文件对应的topic 二.直接进行remap操作 ...

  8. Java基础笔记(十四)——面向对象(续)【构造方法和this关键字】

    一.构造函数的规则 1.构造方法是用来在对象实例化时初始化对象的成员变量的,以完成对象的初始化工作. 2.构造方法与类名相同且没有返回值(返回值也不能为void型).如:public 构造方法名( ) ...

  9. JMeter - 后处理器/脚本语言 - 比较

    当我们使用JMeter / Response数据处理进行密集负载测试时,我们可能会非常小心我们选择的后处理器/脚本语言的类型.在这篇文章中,我想说明这些后处理器/脚本语言如何影响测试的整体性能. 我们 ...

  10. Python Unittest - Test Fixtures 测试夹具

    一.什么是测试夹具 定义单个或者多个测试所需的环境准备(setUp),以及环境清理(tearDown). 例:连接数据库,或者创建Selenium WebDriver driver实例 二.测试夹具有 ...