【react】 手lu日历小组件

初级版本

本月之前不可点击 ;

默认选中 今日 ;

日历排版从每月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
                })
            }
        }

  

原文地址:https://www.cnblogs.com/522040-m/p/13948768.html