微信小程序日歷組件開(kāi)發(fā)

# 微信小程序日歷組件開(kāi)發(fā)

微信小程序基礎(chǔ)知識(shí)

微信小程序 框架介紹

組件文檔

上述是開(kāi)發(fā)小程序的基本知識(shí)。

今天需要說(shuō)的是根據(jù)小程序提供的基本組件來(lái)開(kāi)發(fā)一個(gè)日歷選擇器組件改衩,主要參考Ant Design的日期選擇器鬼佣。如圖

image.png

image.png

image.png

設(shè)計(jì)思路

  • 日期選擇器,單個(gè)View 一共有42個(gè)元素 當(dāng)月的日期 以及 前后月份的部分日期

  • 月份選擇器 這個(gè)簡(jiǎn)單 一年一共12個(gè)月

  • 年份選擇器 這個(gè)需要根據(jù)當(dāng)前年份 前后生成一系列的年份

日期選擇器大致實(shí)現(xiàn)思路

當(dāng)我們需要選擇日期的時(shí)候壁涎,也就是日期選擇器出現(xiàn)的時(shí)候休弃,我們需要展示當(dāng)前時(shí)間(年月日)的月歷視圖介牙,所以我們可以根據(jù)當(dāng)前時(shí)間來(lái)對(duì)日歷初始化數(shù)據(jù)來(lái)入手。

固定的部分

1. 一周有7

2. 一年有12個(gè)月

3. 1,3,5,7,8,10,12 每月31天奋岁,2月 28或29(閏年) 其余的30天

變化部分

1. 當(dāng)前日歷卡中的數(shù)據(jù)

2. 當(dāng)前時(shí)間 年份 可選擇范圍

綜上我們可以先設(shè)計(jì)固定部分的實(shí)現(xiàn)

固定部分實(shí)現(xiàn)


   //星期數(shù)組

  var weeks = ["日", "一", "二", "三", "四", "五", "六",];

   //當(dāng)前年份中每個(gè)月的天數(shù)

  var dayCountOfMonth = [31, 28 + util.isLeapYear(year), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];

  //一年中月份組數(shù)

  var monthCount = 12;

變化部分實(shí)現(xiàn)*

當(dāng)前日歷卡數(shù)據(jù)實(shí)現(xiàn)思瘟,這里實(shí)現(xiàn)比較簡(jiǎn)單 按照 6行 7列來(lái)設(shè)計(jì),這樣既能保證當(dāng)前月份 Day的數(shù)量能夠完全顯示出來(lái)闻伶,也方便我們?nèi)ヤ秩緮?shù)據(jù)滨攻,不用費(fèi)力去用空格來(lái)控制。首先我們?nèi)〕雒吭碌牡谝惶鞂?duì)應(yīng)的星期然后記錄下來(lái)

蓝翰,根據(jù)每月第一天的對(duì)應(yīng)的星期光绕,來(lái)填充當(dāng)前月日歷卡的數(shù)據(jù) 例如:當(dāng)前月第一天對(duì)應(yīng)的日期是星期二 , 那么就需要在當(dāng)前日歷卡數(shù)據(jù)中 填充 1個(gè)上個(gè)月最后一天的數(shù)據(jù) + 當(dāng)前月的總數(shù)據(jù) + 下個(gè)月 (42 - 現(xiàn)有數(shù)據(jù))


initMontData: function (dayCountOfMounth, weeksOfTheFirstDayOfEachMonth) {

      var currentYearMonthData = [];

      const cdate = this.data.calenderData.date;

      const lastYearDate = new Date();

      lastYearDate.setFullYear(this.data.calenderData.year - 1);

      var lastYearData = this.initData(lastYearDate);

      var nextYearDate = new Date();

      nextYearDate.setFullYear(this.data.calenderData.year + 1);

      var nextYearData = this.initData(nextYearDate);

      for (var i = 0; i < 12; i++) {

        var currentMonthDayCount = dayCountOfMounth[i];

        var firstDayWeek = weeksOfTheFirstDayOfEachMonth[i];

        var startIndex = firstDayWeek;

        var endIndex = firstDayWeek + dayCountOfMounth[i] - 1;

        var startArray = [];

        var endArray = [];

        var ddd = new Date();

        var cdaycount = dayCountOfMounth[i - 1];

        if (i === 0) {

          ddd.setFullYear(this.data.calenderData.year - 1);;

          ddd.setMonth(11);

          cdaycount = lastYearData.dayCountOfMonth[11];

        } else {

          ddd.setMonth(i - 1);

          cdaycount = dayCountOfMounth[i - 1];

        }

        for (var x = startIndex; x > 0; x--) {

          var temd = new Date();

          temd.setFullYear(ddd.getFullYear());

          temd.setMonth(ddd.getMonth());

          temd.setDate(cdaycount - x + 1)

          var str = util.simpleFormatTime(temd);

          var itemh = {

            date: temd,

            day: temd.getDate(),

            gray: true,

            str: str

          };

          startArray.push(itemh);

        }

        for (var x = 0; x < (42 - endIndex) - 1; x++) {

          var temd = new Date();

          if (i === 11) {

            temd.setFullYear(this.data.calenderData.year + 1);

            temd.setMonth(0);

          } else {

            temd.setFullYear(this.data.calenderData.year);

            temd.setMonth(i + 1);

          }

          temd.setDate(x + 1);

          var str = util.simpleFormatTime(temd);

          var itemh = {

            date: temd,

            day: temd.getDate(),

            gray: true,

            str: str

          };

          endArray.push(itemh);

        }

        var earchMontData = [];

        for (var j = 0; j < startArray.length; j++) {

          earchMontData.push(startArray[j]);

        }

        for (var j = 0; j < currentMonthDayCount; j++) {

          let temd = new Date();

          temd.setFullYear(this.data.calenderData.year);

          temd.setMonth(i);

          temd.setDate(j + 1);

          var str = util.simpleFormatTime(temd);

          var itemh = {

            date: temd,

            day: temd.getDate(),

            gray: false,

            str: str

          };

          earchMontData.push(itemh);

        }

        for (var j = 0; j < endArray.length; j++) {

          earchMontData.push(endArray[j]);

        }

        currentYearMonthData.push(earchMontData);

      }

      return currentYearMonthData;

    }

最終效果圖

image.png

總結(jié)

實(shí)現(xiàn)并不困難畜份,難在合理的去分析當(dāng)前的需求诞帐,代碼是幫朋友寫(xiě)的一個(gè)Demo,還沒(méi)優(yōu)化爆雹,純粹為了實(shí)現(xiàn)停蕉。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市钙态,隨后出現(xiàn)的幾起案子慧起,更是在濱河造成了極大的恐慌,老刑警劉巖册倒,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蚓挤,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡剩失,警方通過(guò)查閱死者的電腦和手機(jī)屈尼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)拴孤,“玉大人,你說(shuō)我怎么就攤上這事甲捏⊙菔欤” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵司顿,是天一觀的道長(zhǎng)芒粹。 經(jīng)常有香客問(wèn)我,道長(zhǎng)大溜,這世上最難降的妖魔是什么化漆? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮钦奋,結(jié)果婚禮上座云,老公的妹妹穿的比我還像新娘疙赠。我一直安慰自己,他們只是感情好朦拖,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布圃阳。 她就那樣靜靜地躺著,像睡著了一般璧帝。 火紅的嫁衣襯著肌膚如雪捍岳。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 50,050評(píng)論 1 291
  • 那天睬隶,我揣著相機(jī)與錄音锣夹,去河邊找鬼。 笑死苏潜,一個(gè)胖子當(dāng)著我的面吹牛银萍,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播窖贤,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼砖顷,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了赃梧?” 一聲冷哼從身側(cè)響起滤蝠,我...
    開(kāi)封第一講書(shū)人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎授嘀,沒(méi)想到半個(gè)月后物咳,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蹄皱,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年览闰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片巷折。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡压鉴,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出锻拘,到底是詐尸還是另有隱情油吭,我是刑警寧澤,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布署拟,位于F島的核電站婉宰,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏推穷。R本人自食惡果不足惜心包,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望馒铃。 院中可真熱鬧蟹腾,春花似錦痕惋、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至珊随,卻和暖如春述寡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背叶洞。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工鲫凶, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人衩辟。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓螟炫,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親艺晴。 傳聞我的和親對(duì)象是個(gè)殘疾皇子昼钻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,860評(píng)論 25 707
  • 我只是一片將落未落的枯葉
    Mono傲寒閱讀 179評(píng)論 0 1
  • 有一個(gè)人的微信圖像你總是點(diǎn)開(kāi)看了又看然评,有一個(gè)人的消息對(duì)話框你鼓起勇氣編輯了長(zhǎng)長(zhǎng)的信息,前一秒發(fā)出后一秒撤回狈究,更多的...
    夢(mèng)的衣裳TY閱讀 920評(píng)論 12 21
  • 安裝 pod 要翻墻 這里我們借助 淘寶的 rubytaobao 鏡像 1.查看當(dāng)前的 ruby 源 在終端輸入命...
    學(xué)不會(huì)灬閱讀 262評(píng)論 0 0