摘要:一前言最近公司要做一個酒店入住的小程序,不可避免的一定會使用到日歷,而小程序沒有內置的日歷組件。二代碼原理分析寫一個日歷只需要知道兩件事情一個月有多少天每個月的第一天是星期幾。
一、前言
最近公司要做一個酒店入住的小程序,不可避免的一定會使用到日歷,而小程序沒有內置的日歷組件。在網上看了一下也沒有非常適合需求的日歷,于是自己寫了一個。
二、代碼 1. 原理分析寫一個日歷只需要知道兩件事情:
一個月有多少天;
每個月的第一天是星期幾。
2. 功能分析由于是酒店入住的日歷,所以需要實現如下功能:
渲染日歷,一般是從本月開始,到半年之后的日歷
過去的日期不可選
實現點擊獲取入住日期、退房日期,以及改變相應日期的顏色和整個時間段的顏色
3. 數據分析根據最后的功能實現,我生成的每個月的數據結構如下:
{ year: 2018, month: 3, fullMonth: "03", allDays:[ { day: 1, fullDay: "01", fullDate: "2018-03-01" }, { day: 2, fullDay: "02", fullDate: "2018-03-02" }, //...... //(后面的數據同上) ] }
year就是年份,month是月份,day是日期,fullDate是完整日期。
fullMonth和fullDay原本是兩個不需要的數據,但是在點擊日期改變顏色的時候用到了,因為小程序沒有提供很好的處理數據的filter。當然這個問題也和我的個人水平有關,如果有哪位大神有更好的方法,請留言告訴我。我非常想去掉這兩個數據。
// calendar.js文件 Page({ data: { week_list: ["日","一","二","三","四","五","六"], startDate: "", endDate: "", date_click: 0 }, // 獲取每月總天數 getAllDaysOfMonth(year,month) { return new Date(year,month,0).getDate(); }, // 獲取每月第一天是星期幾 getFirstDayOfMonth(year,month) { return new Date(year, month - 1, 1).getDay(); }, // 計算本月前空了幾格 getEmptyGrids(year,month) { // FirstDayOfMonth代表本月的第一天是星期幾 const FirstDayOfMonth = this.getFirstDayOfMonth(year, month); let emptyGrids = []; // 有空格的情況 if (FirstDayOfMonth > 0) { for (let i = 0; i < FirstDayOfMonth; i++) { emptyGrids.push({ "num": "", "fullDate": "x" //x是我自己定義的一個值,代表沒有日期 }); } // 將空格放入數組 return emptyGrids; }else{ // 否則返回一個新數組 return []; } }, // 計算本月日歷 getDaysOfThisMonth(year,month) { let days = []; const AllDaysOfMonth = this.getAllDaysOfMonth(year, month); let fullMonth = month.toString().length === 1 ? `0${month}`:month; for (let i = 0; i < AllDaysOfMonth; i++) { let day = i+1, fullDay = day; fullDay = fullDay.toString().length === 1 ? `0${day}` : fullDay; days.push({ day, fullDay, "fullDate": `${year}-${fullMonth}-${fullDay}` }); } // 返回每個月的具體日期 return days; }, // 循環渲染日歷 // 從本月開始渲染,n代表包括本月開始連續渲染幾個月 fillCalendar(n) { let year = this.data.cur_year, month = this.data.cur_month, fullMonth, canlendar_data = []; // 計算年月以及具體日歷 for (let i = this.data.cur_month; i < this.data.cur_month + n; i++) { let EmptyGrids = this.getEmptyGrids(year, month); let DaysOfThisMonth = this.getDaysOfThisMonth(year, month); // 把空格和具體日歷合為一個數組 let allDays = [...EmptyGrids, ...DaysOfThisMonth]; // 對年份和月份的計算做一些判斷 if (month > 12) { year++; month = 1; fullMonth = "01" canlendar_data.push({ year, month, fullMonth, allDays }); month++; }else{ fullMonth = month.toString().length === 1 ? `0${month}` : month; canlendar_data.push({ year, month, fullMonth, allDays }); month++; } } this.setData({ canlendar_data }) }, onLoad() { const date = new Date(); const cur_year = date.getFullYear(); const cur_month = date.getMonth() + 1; const cur_day = date.getDate(); this.setData({ date, cur_year, cur_month, cur_day }) let month = this.data.cur_month.toString().length === 1 ? `0${this.data.cur_month}` : this.data.cur_month; let day = this.data.cur_day.toString().length === 1 ? `0${this.data.cur_day}` : this.data.cur_day; let nowDate = `${cur_year}-${month}-${day}`; this.setData({ nowDate }) this.fillCalendar(6); }, // 點擊日期 chooseDate(e) { const year_click = e.currentTarget.dataset.year; const month_click = e.currentTarget.dataset.month; const day_click = e.currentTarget.dataset.day; console.log(year_click,month_click,day_click); // 如果是空格或者以前的日期就直接返回 if(day_click === ""||`${year_click}-${month_click}-${day_click}` < this.data.nowDate) { return; } // 獲取點擊對象的id let id = e.currentTarget.dataset.id; // data_click為0代表選擇的是入住日期,否則就是離店日期 if (this.data.date_click == 0){ // 選擇入住日期 this.setData({ startDate: `${year_click}-${month_click}-${day_click}`, date_click: 1 }) }else { let newDay = new Date(Date.parse(id)); let oldDay = new Date(Date.parse(this.data.startDate)); // 判斷第二次點擊的日期在第一次點擊的日期前面還是后面 if (newDay > oldDay) { this.setData({ endDate: `${year_click}-${month_click}-${day_click}`, date_click: 2 }) }else{ this.setData({ startDate: `${year_click}-${month_click}-${day_click}`, endDate: "", date_click: 1 }) } } } })
{{item}} {{canlendar_item.year}}年{{canlendar_item.month}}月 startDate&&item.fullDate {{item.day}}
{{idx===0||idx===6?"relax":""}} 是改變周六周日的顏色, 到此一個簡單的日歷就完成了,當然這個日歷無法滿足所有業務需求,但是基本的日歷渲染功能以及點擊選擇功能都有。所以在業務需求之上對其進行小部分改變就可以了,希望大家可以留言指出我的問題,我也會進一步的改善這個日歷代碼。
{{item.fullDate
{{endDate===item.fullDate?"endActive":""}} 判斷點擊的是離店日期,
{{item.fullDate>startDate&&item.fullDate
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/93094.html
摘要:最近在做微信小程序項目,其中涉及到日歷。其次,弄清楚每月一號對應的是周幾。當月天數已知,上月殘余天數,我們可以用當月號是周幾來推斷出來,下月殘余天數,正好用當月天數上月殘余。 最近在做微信小程序項目,其中涉及到日歷。一直以來,遇到日歷,就是網上隨便找個插件,這次心血來潮,想著自己去實現一下。這次不是封裝功能強大,健碩完美的組件,只是記錄一下,主體思路。更多功能還得根據項目需要,自己去挖...
摘要:手把手教你做個人火的時候,隨便一個都能賺的盆滿缽滿,但是,個人沒有服務端,沒有美工,似乎就不能開發了,真的是這樣的嗎秘密花園經典的中文手冊。涵蓋前端知識體系知識結構圖書推薦以及入門視頻教程,全的簡直不要不要的了。 JavaScript 實現點擊按鈕復制指定區域文本 html5 的 webAPI 接口可以很輕松的使用短短的幾行代碼就實現點擊按鈕復制區域文本的功能,不需要依賴 flash。...
摘要:封裝手寫的方筆記使用檢測文件前端掘金副標題可以做什么以及使用中會遇到的坑。目的是幫助人們用純中文指南實現復選框中多選功能前端掘金作者緝熙簡介是推出的一個天挑戰。 深入理解 JavaScript Errors 和 Stack Traces - 前端 - 掘金譯者注:本文作者是著名 JavaScript BDD 測試框架 Chai.js 源碼貢獻者之一,Chai.js 中會遇到很多異常處理...
摘要:封裝手寫的方筆記使用檢測文件前端掘金副標題可以做什么以及使用中會遇到的坑。目的是幫助人們用純中文指南實現復選框中多選功能前端掘金作者緝熙簡介是推出的一個天挑戰。 深入理解 JavaScript Errors 和 Stack Traces - 前端 - 掘金譯者注:本文作者是著名 JavaScript BDD 測試框架 Chai.js 源碼貢獻者之一,Chai.js 中會遇到很多異常處理...
閱讀 2950·2021-11-25 09:43
閱讀 3326·2021-11-24 09:39
閱讀 2827·2021-09-22 15:59
閱讀 2173·2021-09-13 10:24
閱讀 509·2019-08-29 17:02
閱讀 2098·2019-08-29 13:23
閱讀 3057·2019-08-29 13:06
閱讀 3538·2019-08-29 13:04