1.安装
// 安装依赖
yarn add vue-material-year-calendary
2.创建组件
<template>
<div class='yearCalendar'>
<div class="yearBox">
<el-button class="yearBtn" size="mini" @click="yearClick('clear')">清空选中日期</el-button>
<span><i class="el-icon-d-arrow-left" @click="yearClick('reduce')"></i></span>
<span class="yearText">{{currentYear}}年</span>
<i class="el-icon-d-arrow-right" @click="yearClick('add')"></i>
<el-button class="yearBtn" type="primary" size="mini" @click="yearClick('current')">切换到今年</el-button>
</div>
<YearCalendar
v-model="currentYear"
:activeDates="currentActiveDates"
@toggleDate="toggleDate"
prefixClass="your_customized_wrapper_class"
:activeClass="activeClass"
lang="tw"
:showYearSelector="false"
></YearCalendar>
<div class="btnBox">
<el-button @click="yearCalendarClick(false)">取 消</el-button>
<el-button type="primary" @click="yearCalendarClick(true)">确 定</el-button>
</div>
</div>
</template>
<script>
import YearCalendar from 'vue-material-year-calendar'
import { formatDay } from '@/utils/index.js'
export default {
props: {
activeDates: {
type: Array,
default() {
return []
}
},
year: {
type: Number,
default: new Date().getFullYear()
}
},
components: {
YearCalendar
},
data:() => ({
currentYear: new Date().getFullYear(),
activeClass: '',
currentActiveDates: []
}),
mounted() {
// this.activeDates.push({
// date: formatDay(new Date()),
// className: 'blue'
// })
},
created() {
this.update()
},
watch: {
activeDates: {
handler(options) {
this.update()
},
deep: true
}
},
methods: {
// 回显
update() {
this.currentActiveDates = []
if(this.activeDates.length) {
this.activeDates.forEach(date => {
this.currentActiveDates.push({
date,
className: 'blue'
})
})
}
this.currentYear = this.year ? this.year : new Date().getFullYear()
},
// 点击日期
toggleDate (dateInfo) {
if(dateInfo.selected){
this.currentActiveDates.push({
date: dateInfo.date,
className: 'blue'
})
// 只取两组时间 当选择时间多于2组时 清除第一个
// this.currentActiveDates.length > 2 ? this.currentActiveDates.shift() : ''
}else {
this.currentActiveDates.splice(this.currentActiveDates.findIndex(item => item.date == dateInfo.date), 1) // 再次点击取消选中
}
},
yearCalendarClick(flag) {
if(flag){
let dateList = []
this.currentActiveDates.forEach(item => {
dateList.push(item.date)
})
this.$emit('calendarChange', dateList)
}else {
this.$emit('calendarChange')
}
},
// 切换年份
yearClick(flag) {
switch (flag) {
case 'reduce': // 年份减少
this.currentYear--
break;
case 'add': // 年份增加
this.currentYear++
this.currentActiveDates = []
break;
case 'current': // 实时年份
if(this.currentYear != new Date().getFullYear()) {
this.currentYear = new Date().getFullYear()
this.currentActiveDates = []
}
break;
case 'clear': // 清空选中的日期
this.currentActiveDates = []
break;
default:
break;
}
}
},
};
</script>
<style lang="scss" scoped>
.yearCalendar {
.yearBox {
color: rgb(182,194,205);
font-size: 16px;
text-align: center;
padding: 10px 0;
.yearText {
font-size: 14px;
color: rgb(81,88,96);
padding: 0 50px;
}
.yearBtn {
margin: 0 20px;
}
}
.btnBox {
margin-top: 8px;
text-align: center;
}
}
::v-deep .vue-calendar__container {
background-color: #fff;
box-shadow: 0 0 0 0 rgb(0 0 0 / 10%);
.calendar__title {
justify-content: left;
height: 32px;
line-height: 32px;
border-bottom: 0;
margin-bottom: 0;
font-size: 12px;
}
.day__weektitle {
height: 36px;
opacity: 1;
background: rgba(0, 8, 25, 0.05);
font-size: 12px !important;
}
.calendar__body {
padding: 0;
background: #ffffff;
}
.calendar__day {
color: #595e6a;
font-size: 12px;
font-weight: 400;
}
.container__months {
padding: 0;
flex: auto;
}
.container__month {
// flex: 24%;
flex: 16.3%;
padding: 0 12px;
border: 1px solid rgba(210,217,228,0.5);
border-bottom: none;
}
.container__month:not(:first-child,:nth-child(7)) {
border-left: none;
}
.calendar:hover {
transform: scale(1);
box-shadow: 0 0 0 0 rgb(0 0 0 / 10%);
}
.calendar {
transform: scale(1);
box-shadow: 0 0 0 0 rgb(0 0 0 / 10%);
min-height: auto;
width: 100%;
padding-left: 0px;
margin-bottom: 8px;
.day {
font-size: 12px;
}
.day:hover {
border-radius: 50%;
background-color: rgb(209,236,255);
}
}
.grey {
color: #bfc1c5;
}
.blue {
color: #fff;
background-color: rgb(31,160,254);
border-radius: 50%;
}
}
</style>
3.使用
<YearCalendar @calendarChange="calendarChange" :activeDates="form.stopDates" :year="form.year*1"/>