需求:想要一个周日程表,记录每天的计划,点击可查看详情。可自定义时间段通过后台获取时间段显示
分析:
效果如下:自己写的肯定有不足的地方,如有问题请大佬们提出,进行改进
优化修改:数据量大时,格子显示太长问题,这里进行了优化,如果超过2个就进行展开与收缩操作
npm包 使用文档点击这里
npm i wschedule -S
源码已经更新到github上了,点击这里欢迎大佬们来提问
封装组件
使用
上课日期:{{ row.date }}
上课时间:{{ row.timePeriod }}
上课老师:{{ row.watchman }}
上课地点:{{ row.place }}
组件完整代码
Html代码
上周
本周
下周
{{ todayDate }}
{{ sta.title }}
{{ item }}
{{ item }}
{{ `${item && item.isCurDate ? item && item.showDate + '(今天)' || '' : item && item.showDate || ''}` }}
-
{{ period.timePeriod }}
收缩
暂无数据
js代码 MyTools点击这里
import { formatDate, getCurDay } from '../utils/MyTools'
export default {
name: 'WSchedule',
props: {
planList: {
type: Array,
default: []
},
cardStatus: {
type: Object,
default: () => {
return {
1: {
title: '已过期',
color: '#9CADADB7'
},
2: {
title: '进行中',
color: '#FF6200'
},
3: {
title: '未开始',
color: '#3291F8'
},
}
}
},
isFirstDayOfMondayOrSunday: {
type: Number,
default: 1,
}
},
data () {
return {
weeks: [
'时段', '周一', '周二', '周三', '周四', '周五', '周六', '周日',
],
todayDate: '',
months: [],
curDate: '',
nowDate: new Date(),
}
},
watch: {
isFirstDayOfMondayOrSunday: {
handler (val) {
if (val > 1) {
let arr = ['周一', '周二', '周三', '周四', '周五', '周六', '周日']
const arr1 = arr.slice(val - 1)
const arr2 = arr.slice(0, val - 1)
this.weeks = ['时段', ...arr1, ...arr2]
}
},
immediate: true
}
},
mounted () {
this.getCurWeek()
},
methods: {
//展开与缩放操作
handleExpand (row) {
row.isExpend = !row.isExpend
},
/**
* 获取 时间
* @param time
*/
getWeek (time) {
this.curDate = new Date(time)
//当前是周几
const whichDay = time.getDay()
let num = 0
if (this.isFirstDayOfMondayOrSunday <= whichDay) {
num = this.isFirstDayOfMondayOrSunday
} else {
num = this.isFirstDayOfMondayOrSunday - 7
}
const weekDay = time.getDay() - num
time = this.addDate(time, weekDay * -1)
for (let i = 0; i < 7; i++) {
const { year, month, day } = formatDate(i === 0 ? time : this.addDate(time, 1))
this.months.push({
date: `${year}-${month}-${day}`,
showDate: `${month}-${day}`,
timestamp: new Date(`${year}-${month}-${day}`).getTime()
})
}
this.months.sort((a, b) => a.timestamp - b.timestamp)
delete this.months[0]
this.todayDate = `${this.months[1].date} ~ ${this.months[this.months.length - 1].date}`
},
/**
* 处理日期
* @param date
* @param n
* @returns {*}
*/
addDate (date, n) {
date.setDate(date.getDate() + n)
return date
},
/**
* 上周
*/
getLastWeek () {
const date = this.addDate(this.curDate, -7),
{ year, month, day } = formatDate(date),
dateObj = {
date: `${year}-${month}-${day}`,
timestamp: new Date(`${year}-${month}-${day}`).getTime()
}
this.dealDate(date)
this.$emit('changeWeek', dateObj)
},
/**
* 本周
*/
getCurWeek () {
const { year, month, day } = formatDate(new Date()),
dateObj = {
date: `${year}-${month}-${day}`,
timestamp: new Date(`${year}-${month}-${day}`).getTime()
}
this.dealDate(new Date())
this.$emit('changeWeek', dateObj)
},
/**
* 下周
*/
getNextWeek () {
const date = this.addDate(this.curDate, 7),
{ year, month, day } = formatDate(date),
dateObj = {
date: `${year}-${month}-${day}`,
timestamp: new Date(`${year}-${month}-${day}`).getTime()
}
this.dealDate(date)
this.$emit('changeWeek', dateObj)
},
/**
* 显示当天日期状态
* @param date
*/
dealDate (date) {
this.months = ['']
this.getWeek(date)
const curDate = getCurDay()
this.months.forEach(item => {
item.isCurDate = item.date === curDate
})
},
/**
* 点击卡片子内容查看详情
* @param row
*/
handleDetail (row) {
this.$emit('handleDetail', row)
},
/**
* 点击卡片查看全部内容
* @param month
* @param period
*/
handleCardDetail (month, period) {
this.$emit('handleCardDetail', { ...month, ...period })
}
}
}
css 代码
1、卡片空白数据无法获取,添加获取卡片全部详细数据方法handleCardDetail;
2、日历的显示问题优化,比如第一天想显示周日,或者显示周三,这次加了一个属性isFirstDayOfMondayOrSunday,传入对应的数字,周一就是1,周日就是7,以此类推
3、优化 每个日期卡片显示多调数据时,可以进行展开、缩放功能问题,数据格式进行改进