下载日历组件npm i vue-calendar-component --save
在文件中引入插件运行后插件报错 Clock is not defined 解决方法如下:
1.在node_modules目录中找到vue-calendar-component,将src文件单独拿出,重新封装成组件
2.将index.js文件中后三行代码注释掉就可以成功展示了
3.运行后展示和ui设计不一样,修改了calendar.vue中css代码,添加了回到今日功能,具体代码如下
calendar.vue代码
<style scoped>
@media screen and (min-width: 460px) {
.wh_item_date:hover {
background: rgb(217, 236, 255);
border-radius: 100px;
color: rgb(102, 177, 255);
cursor: pointer;
}
}
* {
margin: 0;
padding: 0;
}
.wh_container {
max-width: 280px;
margin: auto;
}
li {
list-style-type: none;
}
.wh_top_changge {
display: flex;
width: 50%;
margin-left: 43%;
margin: auto;
}
.wh_top_changge li {
cursor: pointer;
display: flex;
color: #666;
font-size: 15px;
flex: 1;
justify-content: center;
align-items: center;
height: 47px;
}
.wh_top_changge .wh_content_li {
cursor: auto;
flex: 3;
font-family: Helvetica;
}
.wh_content_all {
font-family: -apple-system, BlinkMacSystemFont, "PingFang SC",
"Helvetica Neue", STHeiti, "Microsoft Yahei", Tahoma, Simsun, sans-serif;
background-color: #fff;
width: 100%;
overflow: hidden;
padding-bottom: 8px;
border-radius: 8px;
}
.wh_content {
display: flex;
flex-wrap: wrap;
padding: 0 3% 0 3%;
width: 100%;
}
.wh_content:first-child .wh_content_item_tag,
.wh_content:first-child .wh_content_item {
color: #ddd;
font-size: 16px;
}
.wh_content_item,
wh_content_item_tag {
font-size: 15px;
width: 13.4%;
text-align: center;
color: #303133;
position: relative;
}
.wh_content_item {
height: 40px;
}
.wh_top_tag {
width: 40px;
height: 40px;
line-height: 40px;
margin: auto;
display: flex;
justify-content: center;
align-items: center;
color: #409EFF;
border-top: 1px solid rgba(227, 227, 227, 0.6);
border-bottom: 1px solid rgba(227, 227, 227, 0.6);
}
.wh_item_date {
width: 40px;
height: 40px;
line-height: 40px;
margin: auto;
display: flex;
justify-content: center;
align-items: center;
}
.wh_jiantou1 {
border-top: 2px solid #909399;
border-left: 2px solid #909399;
width: 7px;
height: 7px;
transform: rotate(-45deg);
}
.wh_jiantou1:active,
.wh_jiantou2:active {
border-color: #ddd;
}
.wh_jiantou2 {
border-top: 2px solid #909399;
border-right: 2px solid #909399;
width: 7px;
height: 7px;
transform: rotate(45deg);
}
.wh_content_item > .wh_isMark {
margin: auto;
border-radius: 100px;
background: blue;
z-index: 2;
}
.wh_content_item .wh_other_dayhide {
color: #bfbfbf;
}
.wh_content_item .wh_want_dayhide {
color: #bfbfbf;
}
.wh_content_item .wh_isToday {
/*border: solid 1px #52a9f3;*/
color: #52a9f3;
border-radius: 100px;
}
.wh_content_item .wh_chose_day {
background: #409EFF;
color: #fff;
border-radius: 100px;
}
.backToTody{
margin-left: 20px;
color: #409EFF;
cursor: pointer;
}
</style>
<template>
<section class="wh_container">
<div class="wh_content_all">
<div class="wh_top_changge">
<li @click="PreMonth(myDate,false)">
<div class="wh_jiantou1"></div>
</li>
<li class="wh_content_li">{{dateTop}}</li>
<li @click="NextMonth(myDate,false)">
<div class="wh_jiantou2"></div>
</li>
</div>
<div class="wh_content">
<div class="wh_content_item" v-for="tag in textTop">
<div class="wh_top_tag">{{tag}}</div>
</div>
</div>
<div class="wh_content">
<div class="wh_content_item" v-for="(item,index) in list" @click="clickDay(item,index)">
<div
class="wh_item_date"
v-bind:class="[{ wh_isMark: item.isMark},{wh_other_dayhide:item.otherMonth!=='nowMonth'},{wh_want_dayhide:item.dayHide},{wh_isToday:item.isToday},{wh_chose_day:item.chooseDay},setClass(item)]"
>{{item.id}}</div>
</div>
</div>
<div class="backToTody" @click="ChoseMonth(getDate(new Date()).fullDate)">回到今天</div>
</div>
</section>
</template>
<script>
import timeUtil from "./calendar";
export default {
name: 'Calendar',
data() {
return {
myDate: [],
list: [],
historyChose: [],
dateTop: ""
};
},
props: {
markDate: {
type: Array,
default: () => []
},
markDateMore: {
type: Array,
default: () => []
},
textTop: {
type: Array,
default: () => ["一", "二", "三", "四", "五", "六", "日"]
},
sundayStart: {
type: Boolean,
default: () => false
},
agoDayHide: {
type: String,
default: `0`
},
futureDayHide: {
type: String,
default: `2554387200`
}
},
created() {
this.intStart();
this.myDate = new Date();
},
methods: {
/**
* 时间转换
*/
getDate(date, AddDayCount = 0) {
if (!date) {
date = new Date()
}
if (typeof date !== 'object') {
date = date.replace(/-/g, '/')
}
const dd = new Date(date)
dd.setDate(dd.getDate() + AddDayCount) // 获取AddDayCount天后的日期
const y = dd.getFullYear()
const m = dd.getMonth() + 1 < 10 ? '0' + (dd.getMonth() + 1) : dd.getMonth() + 1 // 获取当前月份的日期,不足10补0
const d = dd.getDate() < 10 ? '0' + dd.getDate() : dd.getDate() // 获取当前几号,不足10补0
return {
fullDate: y + '/' + m + '/' + d,
year: y,
month: m,
date: d,
day: dd.getDay()
}
},
intStart() {
timeUtil.sundayStart = this.sundayStart;
},
setClass(data) {
let obj = {};
obj[data.markClassName] = data.markClassName;
return obj;
},
clickDay: function(item, index) {
if (item.otherMonth === "nowMonth" && !item.dayHide) {
this.getList(this.myDate, item.date);
}
if (item.otherMonth !== "nowMonth") {
item.otherMonth === "preMonth"
? this.PreMonth(item.date)
: this.NextMonth(item.date);
}
},
ChoseMonth: function(date, isChosedDay = true) {
date = timeUtil.dateFormat(date);
this.myDate = new Date(date);
this.$emit("changeMonth", timeUtil.dateFormat(this.myDate));
if (isChosedDay) {
this.getList(this.myDate, date, isChosedDay);
} else {
this.getList(this.myDate);
}
},
PreMonth: function(date, isChosedDay = true) {
date = timeUtil.dateFormat(date);
this.myDate = timeUtil.getOtherMonth(this.myDate, "preMonth");
this.$emit("changeMonth", timeUtil.dateFormat(this.myDate));
if (isChosedDay) {
this.getList(this.myDate, date, isChosedDay);
} else {
this.getList(this.myDate);
}
},
NextMonth: function(date, isChosedDay = true) {
date = timeUtil.dateFormat(date);
this.myDate = timeUtil.getOtherMonth(this.myDate, "nextMonth");
this.$emit("changeMonth", timeUtil.dateFormat(this.myDate));
if (isChosedDay) {
this.getList(this.myDate, date, isChosedDay);
} else {
this.getList(this.myDate);
}
},
forMatArgs: function() {
let markDate = this.markDate;
let markDateMore = this.markDateMore;
markDate = markDate.map(k => {
return timeUtil.dateFormat(k);
});
markDateMore = markDateMore.map(k => {
k.date = timeUtil.dateFormat(k.date);
return k;
});
return [markDate, markDateMore];
},
getList: function(date, chooseDay, isChosedDay = true) {
const [markDate, markDateMore] = this.forMatArgs();
this.dateTop = `${date.getFullYear()}年${date.getMonth() + 1}月`;
let arr = timeUtil.getMonthList(this.myDate);
for (let i = 0; i < arr.length; i++) {
let markClassName = "";
let k = arr[i];
k.chooseDay = false;
const nowTime = k.date;
const t = new Date(nowTime).getTime() / 1000;
//看每一天的class
for (const c of markDateMore) {
if (c.date === nowTime) {
markClassName = c.className || "";
}
}
//标记选中某些天 设置class
k.markClassName = markClassName;
k.isMark = markDate.indexOf(nowTime) > -1;
//无法选中某天
k.dayHide = t < this.agoDayHide || t > this.futureDayHide;
if (k.isToday) {
this.$emit("isToday", nowTime);
}
let flag = !k.dayHide && k.otherMonth === "nowMonth";
if (chooseDay && chooseDay === nowTime && flag) {
this.$emit("choseDay", nowTime);
this.historyChose.push(nowTime);
k.chooseDay = true;
} else if (
this.historyChose[this.historyChose.length - 1] === nowTime &&
!chooseDay &&
flag
) {
k.chooseDay = true;
}
}
this.list = arr;
}
},
mounted() {
this.getList(this.myDate);
},
watch: {
markDate: {
handler(val, oldVal) {
this.getList(this.myDate);
},
deep: true
},
markDateMore: {
handler(val, oldVal) {
this.getList(this.myDate);
},
deep: true
},
agoDayHide: {
handler(val, oldVal) {
this.getList(this.myDate);
},
deep: true
},
futureDayHide: {
handler(val, oldVal) {
this.getList(this.myDate);
},
deep: true
},
sundayStart: {
handler(val, oldVal) {
this.intStart();
this.getList(this.myDate);
},
deep: true
}
}
};
</script>
页面中使用
<Calendar
ref="Calendar"
v-on:choseDay="clickDay"
v-on:changeMonth="changeDate"
v-on:isToday="clickToday">
</Calendar>
import Calendar from '../../components/calendar/calendar.vue'
components: {
Calendar
},
mounted() {
this.$refs.Calendar.ChoseMonth('2023-11-27')
},
methods: {
clickDay(data) { //选中某天
console.log(111,data);
},
changeDate(data) { //左右点击切换月份
console.log(222, data);
},
clickToday(data) { // 跳到了本月
console.log(333, data);
// this.$refs.Calendar.ChoseMonth('2023-11-27')
}
}
最终展示效果
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。