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