初级版本
本月之前不可点击 ;
默认选中 今日 ;
日历排版从每月1号开始找对应星期的下标进行对照,前或后为空,不做上下月份的铺满

升级版本
可无限上月;
默认当日 ;
日历铺满;翻月默认显示排列得第一个;全选所有未被操作过的日历(历史日历不可被操作,只可查看详情,所以即使“”从未操作“”也不被选中);
点击已操作日历显示操作详情,选择未操作的日历则进入批量操作的交互



贴部分代码 记录一下
dateInit = (setYear, setMonth, next) => {
console.log("schedulings", this.state.schedulings)
const { schedulings } = this.state
//全部时间的月份都是按0~11基准,显示月份才+1
let dateArr = []; //需要遍历的日历数组数据
let arrLen = 0; //dateArr的数组长度
let now = setYear && setYear != "1" ? new Date(setYear, setMonth) : new Date();
let year = setYear && setYear != "1" ? setYear : now.getFullYear();
let nextYear = 0;
let month = setMonth || now.getMonth(); //没有+1方便后面计算当月总天数
let nextMonth = (month + 1) > 11 ? 1 : (month + 1);
let startWeek = new Date(year + '/' + (month + 1) + '/' + 1).getDay(); //目标月1号对应的星期 星期数组对应下标 0 日 1 一 2 二
// let startWeek = 0
let dayNums = new Date(year, nextMonth, 0).getDate(); //获取目标月有多少天
// console.log("new Date(year + '/' + (month + 1) + '/' + 1).getDay()",new Date(year + '/' + (month + 1) + '/' + 1).getDay(),"dayNums",dayNums)
let obj = {};
let num = 0;
//月份大于12 年份增加 1
if (month + 1 > 11) {
nextYear = year + 1;
dayNums = new Date(nextYear, nextMonth, 0).getDate();
}
arrLen = schedulings.length;
console.log("aeeLen", arrLen, "startWeek", startWeek, "dayNums", dayNums)
//设置日历显示
// for (let i = 0; i < arrLen; i++) {
// num = i - startWeek + 1;
// obj = {
// dateLine: '' + year + "" + (month + 1 > 9 ? month + 1 : "0" + (month + 1)) + "" + (num > 9 ? num : "0" + num),//日期格式 20200803
// isToday: '' + year + "-" + (month + 1) + "-" + num,
// dateNum: num,
// nowYearMonthDate: new Date(year + "/" + (month + 1) + "/" + num).getTime(),//时间戳
// nowYearMDate: new Date(year + "/" + (month + 1)).getTime(),//时间戳
// lookDateBActive: false
// }
// console.log("---",'' + year + "" + (month + 1 > 9 ? month + 1 : "0" + (month + 1)) + "" + (num > 9 ? num : "0" + num))
// if (this.state.schedulings.length > 0) {
// let sObj = this.state.schedulings[num - 1];
// obj.dateSub = sObj && sObj.text ? sObj.text : "";
// obj.textCode = sObj && sObj.textCode ? sObj.textCode : "";
// }
// else {
// obj = {};
// }
// dateArr[i] = obj;
// }
schedulings && schedulings.forEach((item, i) => {
item.isToday ='' + Number(item.year) + "-" + (item.month) + "-" + item.dateNum
item.nowYearMonthDate = new Date(Number(item.year) + "/" + (item.month) + "/" + item.dateNum).getTime()//时间戳
item.nowYearMDate = new Date(Number(item.year) + "/" + (item.month)).getTime()//时间戳
item.lookDateBActive=false
dateArr[i]=item
})
this.setState({
// allDate,
dateArr:this.state.schedulings
// result,
}, () => {
// console.log("dateArr------------", dateArr)
if (setYear == "1") {
this.handleDefaultActive()
this.initBatch()
this.updateDate("1")
}
let newArr = []
let arr = []
//点击下一个月
if (next) {
console.log("下个月", this.state.nowYearMonthDate, "dateArr", dateArr)
try {
dateArr && dateArr.map((item, i) => {
item.lookDateBActive = false
if (item.isToday) {
//点击的下一个月
if (item.dateLine >= this.state.nowDateLine) {
arr.push(item)
//未排 进入批量
if (arr[0].textCode == "U") {
// this.handleDefalutChick(arr[0].dateLine, "1")
throw 'out';
} else {
//已排或历史
newArr.push(item)
}
//历史上一个月 小于当前月份的情况
}if(item.dateLine < this.state.nowDateLine){
arr.push(item)
newArr.push(item)
}
}
})
} catch (e) {
}
this.setState({
activeDate: (arr[0] && arr[0].textCode && arr[0].textCode != "U") && newArr[0] ? newArr[0].isToday : "",
lookDateBLength: 0,
lookDateBArr: []
}, () => {
// console.log("arrrr",arr,"arr[0]",arr[0]
this.lookActive((arr[0] && arr[0].textCode && arr[0].textCode != "U") ? newArr[0] : arr[0])
})
}
//点击上一个月 需注意当前月日 默认当日 不是月份第一天
// if (next == "prev") {
// if (this.state.typeValue == "batch") {
// dateArr && dateArr.map((item, i) => {
// item.lookDateBActive = false
// })
// this.setState({
// activeDate: "",
// dateArr,
// }, () => {
// })
// }
// }
//保存批量之后 再次默认
if (next == "1") {
// this.handleDefaultActive()
// if (this.state.typeValue == "batch") {
this.handleDefaultActive()
// }
}
});
}
//全选
handleCheckAll = (e) => {
const { dateArr, year, month, nowYearMDate, nowYearMonthDate } = this.state
let lookDateBArr = []
if (e.target.checked) {
this.setState({
checkValue: e.target.checked
})
dateArr && dateArr.map((item, i) => {
if (item.dateNum && item.textCode == "U" && item.nowYearMonthDate >= nowYearMonthDate) {
item.lookDateBActive = true
lookDateBArr.push(item)
this.setState({
lookDateBLength: lookDateBArr.length,
lookDateBArr,
})
}
})
this.setState({
dateArr
})
// this.handleBatchTime()
} else {
this.setState({
checkValue: false
})
dateArr && dateArr.map((item, i) => {
if (item.dateNum && item.textCode == "U") {
item.lookDateBActive = false
this.setState({
lookDateBLength: 0,
lookDateBArr: []
})
}
})
this.setState({
dateArr
})
}
}