1. 程式人生 > 其它 >仿造element calardar 製作可填充日曆- 解決不能跨兩個月選擇日期渲染日曆問題

仿造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>

示例: