在element-ui中calender组件的基础之上,对它进行一些定制。如下是完成之后的样子。
效果图
前言
这个组件比较大(主页中的代码也比较多),我们会单独提出来成一个
在views\dashboard下创建一名为calender.vue的组件
|-dashboard
|-calender.vue # 日历组件-新创建的组件
|-index.vue # 主页
内容如下
<template>
<el-calendar v-model="curDate"></el-calendar>
</template>
<script>
export default {
data() {
return {
curDate: new Date()
}
}
}
</script>
在主页中使用日历组件
<el-card class="box-card">
<div slot="header" class="header">
<span>工作日历</span>
</div>
<!-- 放置日历组件 -->
<calender />
</el-card>
用插槽自定义日历内容显示
slot="dateCell"
<template>
<el-calendar v-model="currentDate">
<template slot="dateCell">
<div class="date-content">
<span class="text">01</span>
<span class="rest">休</span>
</div>
</template>
</el-calendar>
</template>
<script>
export default {
data() {
return {
curDate: new Date()
}
}
}
</script>
补充样式
<style lang="scss" scoped>
.select-box {
display: flex;
justify-content: flex-end;
}
::v-deep .el-calendar-day {
height: auto;
}
::v-deep .el-calendar-table__row td::v-deep .el-calendar-table tr td:first-child, ::v-deep .el-calendar-table__row td.prev{
border:none;
}
.date-content {
height: 40px;
text-align: center;
line-height: 40px;
font-size: 14px;
}
.date-content .rest {
color: #fff;
border-radius: 50%;
background: rgb(250, 124, 77);
width: 20px;
height: 20px;
line-height: 20px;
display: inline-block;
font-size: 12px;
margin-left: 10px;
}
.date-content .text{
width: 20px;
height: 20px;
line-height: 20px;
display: inline-block;
}
::v-deep .el-calendar-table td.is-selected .text{
background: #409eff;
color: #fff;
border-radius: 50%;
}
::v-deep .el-calendar__header {
display: none
}
</style>
用作用域插槽来填充自定义数据到单元格中
代码
<template>
<el-calendar v-model="curDate">
<template #dateCell="{ date, data }">
<div class="date-content">
<span class="text">{{ getDay(data.day) }}</span>
<span v-if="isWeek(date)" class="rest">休</span>
</div>
</template>
</el-calendar>
</template>
<script>
export default {
data() {
return {
curDate: new Date()
}
},
methods: {
getDay(value) {
const day = value.split('-')[2] // 11, 02
return day.startsWith('0') ? day.slice(1) : day
},
// 判断是否周末
isWeek(date) {
const day = date.getDay()
return day === 6 || day === 0
}
}
}
</script>
split :将一个字符串切割成为一个数组,返回一个数组
slice :是将数组进行截取(只有一个参数时,就代表着从当前索引下标的位置,一直截取的最后)