# pc端個性化日曆實現

来源:https://www.cnblogs.com/status404/archive/2019/04/15/10711053.html
-Advertisement-
Play Games

pc端個性化日曆實現 技術:vue = v for、slot scop 插槽域 需求:需要實現日曆上每一天動態顯示不同的信息 思路:運用vue 中 slot scop 插槽域的知識點,將個性化的代碼樣式放到slot中 再通過slot scop 獲取這個插槽中的所需數據 一、實現日曆組件 思路:佈局上 ...


pc端個性化日曆實現

技術:vue => v-for、slot-scop 插槽域
需求:需要實現日曆上每一天動態顯示不同的信息
思路:運用vue 中 slot-scop 插槽域的知識點,將個性化的代碼樣式放到slot中 再通過slot-scop 獲取這個插槽中的所需數據

一、實現日曆組件

思路:佈局上就是一個7列,行數不確定的表格。只不過,日曆的表格是寬和高相等,隨著瀏覽器的大小變化,表格大大小也要變化,所以要用padding佈局,難點在日期數組的生成上面。
1.佈局的實現
<div class="calendar">
    <div class="calendar-operation">
        <span class="calendar-title">{{title}}</span>
        <div class="calendar-YearMonth">
           <Icon type="ios-arrow-back" style="margin-right:30px;" @click="prev" />
           <div class="calendar-YearMonth-content">{{YearMonth}}</div>
           <Icon type="ios-arrow-forward" style="margin-left:30px;color:" @click="next" />
        </div>****
    </div>
    <div class="calendar-head">
        <div class="calendar-head-item">星期日</div>
        <div class="calendar-head-item">星期一</div>
        <div class="calendar-head-item">星期二</div>
        <div class="calendar-head-item">星期三</div>
        <div class="calendar-head-item">星期四</div>
        <div class="calendar-head-item">星期五</div>
        <div class="calendar-head-item">星期六</div>
    </div>
    <div class="calendar-content">
        <div v-for="(item,index) in dateArray" :key="index" class="calendar-row">
            <div v-for="(val,key) in item" :key="key" :class="{'calendar-cols':true,'calendar-enable':!val.enable}">
                <span class="calendar-cols-content">{{val.value}}</span>
                <div class="calendar-cols-opera" >
                    <div style="height:100%;">
                        <slot :oper = 'val.oper'></slot>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>
<style scoped lang="less">
.calendar{
    width:100%;
    border:1px solid #e8eaec;
    border-left: 0;
    border-radius: 8px;
    background: #fff;
    .calendar-operation {
        height: 60px;
        border-bottom: 1px solid #e8eaec;
        border-left:1px solid #e8eaec;
        .calendar-title{
            display:block;
            font-size:12px;
            color:#fb9153;
            float: left;
            height: 100%;
            line-height:60px;
            padding-left: 40px;
        }
        .calendar-YearMonth{
            display: flex;
            height: 100%;
            justify-content: center;
            align-items: center;
            font-size:17px;
            color: #fb9153;
        }
    }
    .calendar-head {
        display: flex;
        height:40px;
        border-bottom: 1px solid #e8eaec;
        border-left:1px solid #e8eaec;
        .calendar-head-item {
            flex: 1;
            height:100%;
            line-height:40px;
            font-size: 12px;
            text-align: center;
            border-left: 1px solid #e8eaec;
        }
    }
    .calendar-content {
        width: 100%;
        .calendar-row{
            width:100%;
            display: flex;
            .calendar-cols {
                position: relative;
                flex: 1;
                height: 0;
                padding-bottom: 14%;
                border-bottom: 1px solid #e8eaec;
                border-left: 1px solid #e8eaec;
                .calendar-cols-content{
                    display:block;
                    text-align: right;
                    height:0;
                    padding-bottom: 15%;
                    box-sizing: border-box;
                    padding: 0 10px;
                    margin-bottom: 15%;
                }
                .calendar-cols-opera{
                    width:100%;
                    height: 0;
                    padding-bottom: 84%;
                    box-sizing: border-box;
                    overflow-y: auto;
                }
            }  
        }
        .calendar-enable{
            color: #e8eaec;
        }
    }
}
</style>
2.日曆數組的實現
 思路:獲取當前月有多少天,當月第一天對應的星期。
 實現:如何獲取這個月的天數,通過下一個月的第一天 減去一天時間就是這個月的最後一天,進而能知道這個月的天數
 //獲取當月最後一天
 function getLastDate(year,month) {
    let currentMonth = month - 1
    let nextMonth = currentMonth + 1
    if(nextMonth > 11 ) {
        nextMonth = 0
        year++
    }
    //let nextMonthFisrtDate = new Date(year,nextMonth,1).getDate()
    let lastDate = new Date(new Date(year,nextMonth,1).getTime() - 1000*60*60*24).getDate()
    return lastDate
}
//獲取當月第一天對應的星期
function getFirstDay(year,month) {
    let currentMonth = month - 1
    return new Date(year,currentMonth,1).getDay()
}
//獲取最後一天的星期
function getLastDay(year,month) {
    let currentMonth = month - 1
    return new Date(year,currentMonth,getLastDate(year,month)).getDay()
}
//獲取當月 日期數據 
function getDateArray(yearMonth) {
    let year = parseInt(yearMonth.split('-')[0])
    let month = parseInt(yearMonth.split('-')[1])
    let dateArray = []
    let firstDay =  getFirstDay(year,month,1)
    let lastDate = getLastDate(year,month)
    let lastDateDay = getLastDay(year,month)
    let prevLastDate = getLastDate(year,month - 1)
    //緩存每一行數據
    let newArr = []
    //獲取第一行數據
    for(let i=1;i<=7;i++){
        if(i<=firstDay){
            newArr.push({
                date:'',
                value: prevLastDate - (firstDay-i),
                enable: false,
                oper:{}
            })
            
        }
        else{
            newArr.push({
                date:new Date(year,month-1,i-firstDay).getTime(),
                value:i-firstDay,
                enable: true,
                oper:{}
            })
        }
    }
    dateArray.push(newArr) 
    newArr = [] //清空
    let count = 0
    for (let i=(7-firstDay+1);i<=lastDate;i++){
        if ( count < 7){
            newArr.push({
                date:new Date(year,month-1,i).getTime(),
                value:i,
                enable:true,
                oper:[]
            })
        }
        else{
            dateArray.push(newArr)
            newArr = []
            newArr.push({
                date:new Date(year,month-1,i).getTime(),
                value:i,
                enable:true,
                oper:[]
            })
            count = 0
        }
        if (i == lastDate && count == 6) {
            dateArray.push(newArr)
        }
        count++
    }
    //獲取最後一行
    newArr = []
    if(lastDateDay<6){
        for(let i=0;i<=6;i++){
            if(i<=lastDateDay){
                newArr.push({
                    date:new Date(year,month-1,lastDate-(lastDateDay-i)).getTime(),
                    value:lastDate-(lastDateDay-i),
                    enable:true,
                    oper:[]
                })
            }
            else{
                newArr.push({
                    date:'',
                    value:i-lastDateDay,
                    enable:false,
                    oper:[]
                })
            }
        }
        dateArray.push(newArr) 
    }
    return dateArray;
}

二、個性化日曆使用

<Calendar :operData="operData" @change="calendarChange" :title="title">
        <template slot-scope="slotScope">
            <div v-for="(item,index) in slotScope.oper " :key="index" class="calendar-oper">
               <div class="calendar-oper-tag" :style="{background:tagType[item.type].color}">
                   <span>{{item.visitTypeCode}}</span>
               </div>
               <div class="calendar-oper-time">{{item.time}}</div>
               <div class="calendar-oper-content">{{item.content}}</div>
            </div>
        </template>
    </Calendar>

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 得益於 HTML5 WebGL 技術的成熟,從技術上對工控管理的可視化,數據可視化變得簡單易行!完成對工控設備的管理效率,資源管理,風險管理等的大幅度提高,同時也對國家工業4.0計劃作出有力響應! 如本案例所示,是一個基於 HTML5 WebGL 技術實現的計量站三維可視化監控系統,在本案例中,具... ...
  • JavaScript基礎系列 JavaScript是一種基於對象和事件驅動的客戶端腳本語言。 JavaScript的註釋 JavaScript變數,函數名和操作符都是區分大小寫的。 標識符是變數,函數,屬性的名稱,函數里的參數。 命名規則: 字母,數字,下劃線,美元符號,不能以數字開頭 變數的聲明與 ...
  • 博客園css定製 選擇模板SimplClear 代碼如下: 自學第一周前端,可能有許多不到位之處。請各位大佬指正。。。 參考文獻 1. https://www.cnblogs.com/Penn000/p/6947472.html 2. https://blog.csdn.net/siwuxie095 ...
  • 註:以下屬於個人學習中的理解不能保證全部正確,如果有錯誤以後修正。 1.javascript和c#語言一樣嚴格區分大小寫,有沒有類的概念。 2.所有的變數聲明都使用var,雖然能打出藍色int,但卻不能使用,應該是系統的保留字吧。 3.局部變數有塊域(即花括弧{}),這個域不包含if、for、swi ...
  • function Slider(id){ //屬性 // 1. 通過id獲取元素對象(大盒子) this.bigBox = document.getElementById(id); //2. 獲取出大盒子中的所有圖片(數組) this.ullis = this.bigBox.children[0]. ...
  • [開發技巧]·HTML檢測輸入已完成自動填寫下一個內容 個人網站 --> http://www.yansongsong.cn 在上一個博客中簡易實現檢測輸入已完成,我們實現了檢測輸入已完成,現在我們再進一步,在此基礎上,實現檢測輸入已完成自動填寫下一個內容。當我們需要自動填寫的內容,不希望被更改的時 ...
  • 錯誤原因: 子組件 props -> list 要求接收的數據類型是 Array, 然而實際接收到的是 Undefined。 子組件代碼: 所以檢查父組件傳過來的值,保證傳過來的值是子組件所期望的數據類型即可。 ...
  • //HTML部分 <div class="wrap"></div> <div class="popUpBox"> <div class="layer-head"><div class="layer-head-text">彈出框</div><div class="layer-close"></div> ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...