摘要:一前言最近公司要做一個酒店入住的小程序,不可避免的一定會使用到日歷,而小程序沒有內(nèi)置的日歷組件。二代碼原理分析寫一個日歷只需要知道兩件事情一個月有多少天每個月的第一天是星期幾。
一、前言
最近公司要做一個酒店入住的小程序,不可避免的一定會使用到日歷,而小程序沒有內(nèi)置的日歷組件。在網(wǎng)上看了一下也沒有非常適合需求的日歷,于是自己寫了一個。
二、代碼 1. 原理分析寫一個日歷只需要知道兩件事情:
一個月有多少天;
每個月的第一天是星期幾。
2. 功能分析由于是酒店入住的日歷,所以需要實現(xiàn)如下功能:
渲染日歷,一般是從本月開始,到半年之后的日歷
過去的日期不可選
實現(xiàn)點擊獲取入住日期、退房日期,以及改變相應(yīng)日期的顏色和整個時間段的顏色
3. 數(shù)據(jù)分析根據(jù)最后的功能實現(xiàn),我生成的每個月的數(shù)據(jù)結(jié)構(gòu)如下:
{ year: 2018, month: 3, fullMonth: "03", allDays:[ { day: 1, fullDay: "01", fullDate: "2018-03-01" }, { day: 2, fullDay: "02", fullDate: "2018-03-02" }, //...... //(后面的數(shù)據(jù)同上) ] }
year就是年份,month是月份,day是日期,fullDate是完整日期。
fullMonth和fullDay原本是兩個不需要的數(shù)據(jù),但是在點擊日期改變顏色的時候用到了,因為小程序沒有提供很好的處理數(shù)據(jù)的filter。當(dāng)然這個問題也和我的個人水平有關(guān),如果有哪位大神有更好的方法,請留言告訴我。我非常想去掉這兩個數(shù)據(jù)。
// calendar.js文件 Page({ data: { week_list: ["日","一","二","三","四","五","六"], startDate: "", endDate: "", date_click: 0 }, // 獲取每月總天數(shù) 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是我自己定義的一個值,代表沒有日期 }); } // 將空格放入數(shù)組 return emptyGrids; }else{ // 否則返回一個新數(shù)組 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; }, // 循環(huán)渲染日歷 // 從本月開始渲染,n代表包括本月開始連續(xù)渲染幾個月 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); // 把空格和具體日歷合為一個數(shù)組 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":""}} 是改變周六周日的顏色, 到此一個簡單的日歷就完成了,當(dāng)然這個日歷無法滿足所有業(yè)務(wù)需求,但是基本的日歷渲染功能以及點擊選擇功能都有。所以在業(yè)務(wù)需求之上對其進行小部分改變就可以了,希望大家可以留言指出我的問題,我也會進一步的改善這個日歷代碼。
{{item.fullDate
{{endDate===item.fullDate?"endActive":""}} 判斷點擊的是離店日期,
{{item.fullDate>startDate&&item.fullDate
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/93094.html
摘要:最近在做微信小程序項目,其中涉及到日歷。其次,弄清楚每月一號對應(yīng)的是周幾。當(dāng)月天數(shù)已知,上月殘余天數(shù),我們可以用當(dāng)月號是周幾來推斷出來,下月殘余天數(shù),正好用當(dāng)月天數(shù)上月殘余。 最近在做微信小程序項目,其中涉及到日歷。一直以來,遇到日歷,就是網(wǎng)上隨便找個插件,這次心血來潮,想著自己去實現(xiàn)一下。這次不是封裝功能強大,健碩完美的組件,只是記錄一下,主體思路。更多功能還得根據(jù)項目需要,自己去挖...
摘要:手把手教你做個人火的時候,隨便一個都能賺的盆滿缽滿,但是,個人沒有服務(wù)端,沒有美工,似乎就不能開發(fā)了,真的是這樣的嗎秘密花園經(jīng)典的中文手冊。涵蓋前端知識體系知識結(jié)構(gòu)圖書推薦以及入門視頻教程,全的簡直不要不要的了。 JavaScript 實現(xiàn)點擊按鈕復(fù)制指定區(qū)域文本 html5 的 webAPI 接口可以很輕松的使用短短的幾行代碼就實現(xiàn)點擊按鈕復(fù)制區(qū)域文本的功能,不需要依賴 flash。...
摘要:封裝手寫的方筆記使用檢測文件前端掘金副標(biāo)題可以做什么以及使用中會遇到的坑。目的是幫助人們用純中文指南實現(xiàn)復(fù)選框中多選功能前端掘金作者緝熙簡介是推出的一個天挑戰(zhàn)。 深入理解 JavaScript Errors 和 Stack Traces - 前端 - 掘金譯者注:本文作者是著名 JavaScript BDD 測試框架 Chai.js 源碼貢獻者之一,Chai.js 中會遇到很多異常處理...
摘要:封裝手寫的方筆記使用檢測文件前端掘金副標(biāo)題可以做什么以及使用中會遇到的坑。目的是幫助人們用純中文指南實現(xiàn)復(fù)選框中多選功能前端掘金作者緝熙簡介是推出的一個天挑戰(zhàn)。 深入理解 JavaScript Errors 和 Stack Traces - 前端 - 掘金譯者注:本文作者是著名 JavaScript BDD 測試框架 Chai.js 源碼貢獻者之一,Chai.js 中會遇到很多異常處理...
閱讀 2957·2021-11-25 09:43
閱讀 3335·2021-11-24 09:39
閱讀 2843·2021-09-22 15:59
閱讀 2210·2021-09-13 10:24
閱讀 519·2019-08-29 17:02
閱讀 2110·2019-08-29 13:23
閱讀 3069·2019-08-29 13:06
閱讀 3548·2019-08-29 13:04