仿造element calardar 制作可填充日历- 解决不能跨两个月选择日期渲染日历问题
用vue和element开发的一套日历系统,日历内包含所筛选时间的具体时间事宜和数据。发现element自带的calandar组件没有支持跨两个月时间选择的支持。
于是自制了一个,实现思路很简单:
1:利用ement 时间区间选择控件,把所选时间区间依次排开放到一个数组内.
2:遍历数组,进行渲染,这里灵活可控布局都可自定义更改样式。
3:因为还需要带星期几,根据渲染的时间日历日期进行星期几转换为周几
4:因为选择开始时间不是固定的,可能是周一也可能周五等,所以要固定周日在第一个周一第二个,一行正好展示一周,就要做些处理
5:这里方便计算直接在前面安插从周日开始安插,直到当前选中的日期的周天数为止。这样只要第一行符合,后面会自动正确排列因为都是一行七天。
具体代码:
要用到的几个核心时间方法:
一:
根据起始日期和结束日期获取时间段数组
// 根据起始日期和结束日期获取时间段数组 getAllDate(day1, day2) { var getDate = function(str) { var tempDate = new Date(); var list = str.split("-"); tempDate.setFullYear(list[0]); tempDate.setMonth(list[1] - 1); tempDate.setDate(list[2]); return tempDate; } var date1 = getDate(day1); var date2 = getDate(day2); if (date1 > date2) { var tempDate = date1; date1 = date2; date2 = tempDate; } date1.setDate(date1.getDate() + 1); var dateArr = []; var i = 0; while (!(date1.getFullYear() == date2.getFullYear() && date1.getMonth() == date2.getMonth() && date1.getDate() == date2.getDate())) { var dayStr = date1.getDate().toString(); if (dayStr.length == 1) { dayStr = "0" + dayStr; } var monthStr = (date1.getMonth() + 1) < 10 ? "0" + (date1.getMonth() + 1) : date1.getMonth() + 1; dateArr[i] = date1.getFullYear() + "-" + monthStr + "-" + dayStr; i++; date1.setDate(date1.getDate() + 1); } dateArr.splice(0, 0, day1) dateArr.push(day2); return dateArr; }
二:
// 根据日期显示当天的是周几 incomeDetail(date) { var mydate = new Date(date) var weekend = ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"]; return weekend[mydate.getDay()] },
三:
// 插入的空数据时间 fnthisweek() { var firstweek = this.incomeDetail(this.resvaluedate[0]) console.log(firstweek) var mydate = new Date(this.resvaluedate[0]) var thisweekind = mydate.getDay() console.log(thisweekind) this.kongweek = ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"]; this.kongweek.splice(thisweekind) // 直接截取数组,只保留当前日期前的星期 console.log(this.kongweek) },
html 展示:
<el-card style="margin:10px auto;width:100%;"> <ul class="box graybox" v-for="(v,i) in kongweek" :key="i*923+2*Math.random()"> <li> <p>{{v}}</p> </li> </ul> <ul class="box" v-for="(v,i) in resvaluedate" :key="i"> <li> <p>{{incomeDetail(v)}}</p> <p>时间:{{v}}</p> <p>这里是具体内容 接口数据</p> </li> </ul> </el-card>
这样就可以了,剩下的就很简单了,进行具体的数据渲染,根据时间数据接口进行细节布局
整体代码:
<template>
    <div class="hello">
        <el-date-picker v-model="value1" type="daterange" range-separator="至" start-placeholder="开始日期"
            end-placeholder="结束日期" format="yyyy 年 MM 月 dd 日" value-format="yyyy-MM-dd" @change="changepicker">
        </el-date-picker>
        <el-card style="margin:10px auto;width:100%;">
            <ul class="box graybox" v-for="(v,i) in kongweek" :key="i*923+2*Math.random()">
                <li>
                    <p>{{v}}</p>
                </li>
            </ul>
            <ul class="box" v-for="(v,i) in resvaluedate" :key="i">
                <li>
                    <p>{{incomeDetail(v)}}</p>
                    <p>时间:{{v}}</p>
                    <p>这里是具体内容 接口数据</p>
                </li>
            </ul>
        </el-card>
    </div>
</template>
<script>
    export default {
        name: 'HelloWorld',
        props: {
            msg: String
        },
        data() {
            return {
                value1: '',
                resvaluedate: '',
                kongweek: []
            }
        },
        methods: {
            // 插入的空数据时间
            fnthisweek() {
                var firstweek = this.incomeDetail(this.resvaluedate[0])
                console.log(firstweek)
                var mydate = new Date(this.resvaluedate[0])
                var thisweekind = mydate.getDay()
                console.log(thisweekind)
                this.kongweek = ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"];
                this.kongweek.splice(thisweekind) // 直接截取数组,只保留当前日期前的星期
                console.log(this.kongweek)
            },
            // 根据日期显示当天的是周几
            incomeDetail(date) {
                var mydate = new Date(date)
                var weekend = ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"];
                return weekend[mydate.getDay()]
            },
            // 改变时间事件
            changepicker(v) {
                console.log(v)
                this.resvaluedate = this.getAllDate(v[0], v[1])
                this.fnthisweek()
            },
            // 根据起始日期和结束日期获取时间段数组
            getAllDate(day1, day2) {
                var getDate = function(str) {
                    var tempDate = new Date();
                    var list = str.split("-");
                    tempDate.setFullYear(list[0]);
                    tempDate.setMonth(list[1] - 1);
                    tempDate.setDate(list[2]);
                    return tempDate;
                }
                var date1 = getDate(day1);
                var date2 = getDate(day2);
                if (date1 > date2) {
                    var tempDate = date1;
                    date1 = date2;
                    date2 = tempDate;
                }
                date1.setDate(date1.getDate() + 1);
                var dateArr = [];
                var i = 0;
                while (!(date1.getFullYear() == date2.getFullYear() &&
                        date1.getMonth() == date2.getMonth() &&
                        date1.getDate() == date2.getDate())) {
                    var dayStr = date1.getDate().toString();
                    if (dayStr.length == 1) {
                        dayStr = "0" + dayStr;
                    }
                    var monthStr = (date1.getMonth() + 1) < 10 ? "0" + (date1.getMonth() + 1) : date1.getMonth() + 1;
                    dateArr[i] = date1.getFullYear() + "-" + monthStr + "-" +
                        dayStr;
                    i++;
                    date1.setDate(date1.getDate() + 1);
                }
                dateArr.splice(0, 0, day1)
                dateArr.push(day2);
                return dateArr;
            }
        },
    }
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
    h3 {
        margin: 40px 0 0;
    }
    ul {
        list-style-type: none;
        padding: 0;
    }
    li {
        display: inline-block;
        margin: 0 10px;
    }
    a {
        color: #42b983;
    }
    .box {
        /* max-width: 250px; */
        width: 14.1%;
        height: 300px;
        background: #F0F7FF;
        float: left;
        border: 1px solid #F0F0F0;
    }
    .box.graybox{
        background:#fbfdff;
        color:#ccc;
    }
</style>
示例:



 
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号