成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

微信小程序:手寫日歷組件

genefy / 1951人閱讀

摘要:一前言最近公司要做一個酒店入住的小程序,不可避免的一定會使用到日歷,而小程序沒有內(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ù)。

4.代碼分析
// 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":""}} 是改變周六周日的顏色,
{{item.fullDate{{startDate===item.fullDate?"startActive":""}} 判斷點擊的是入住日期,
{{endDate===item.fullDate?"endActive":""}} 判斷點擊的是離店日期,
{{item.fullDate>startDate&&item.fullDate 四、結(jié)語

到此一個簡單的日歷就完成了,當(dāng)然這個日歷無法滿足所有業(yè)務(wù)需求,但是基本的日歷渲染功能以及點擊選擇功能都有。所以在業(yè)務(wù)需求之上對其進行小部分改變就可以了,希望大家可以留言指出我的問題,我也會進一步的改善這個日歷代碼。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/93094.html

相關(guān)文章

  • 簡陋至極:信小程序日歷組件(思路)

    摘要:最近在做微信小程序項目,其中涉及到日歷。其次,弄清楚每月一號對應(yīng)的是周幾。當(dāng)月天數(shù)已知,上月殘余天數(shù),我們可以用當(dāng)月號是周幾來推斷出來,下月殘余天數(shù),正好用當(dāng)月天數(shù)上月殘余。 最近在做微信小程序項目,其中涉及到日歷。一直以來,遇到日歷,就是網(wǎng)上隨便找個插件,這次心血來潮,想著自己去實現(xiàn)一下。這次不是封裝功能強大,健碩完美的組件,只是記錄一下,主體思路。更多功能還得根據(jù)項目需要,自己去挖...

    import. 評論0 收藏0
  • 前端基礎(chǔ)入門

    摘要:手把手教你做個人火的時候,隨便一個都能賺的盆滿缽滿,但是,個人沒有服務(wù)端,沒有美工,似乎就不能開發(fā)了,真的是這樣的嗎秘密花園經(jīng)典的中文手冊。涵蓋前端知識體系知識結(jié)構(gòu)圖書推薦以及入門視頻教程,全的簡直不要不要的了。 JavaScript 實現(xiàn)點擊按鈕復(fù)制指定區(qū)域文本 html5 的 webAPI 接口可以很輕松的使用短短的幾行代碼就實現(xiàn)點擊按鈕復(fù)制區(qū)域文本的功能,不需要依賴 flash。...

    shinezejian 評論0 收藏0
  • 前端空間 - 收藏集 - 掘金

    摘要:封裝手寫的方筆記使用檢測文件前端掘金副標(biāo)題可以做什么以及使用中會遇到的坑。目的是幫助人們用純中文指南實現(xiàn)復(fù)選框中多選功能前端掘金作者緝熙簡介是推出的一個天挑戰(zhàn)。 深入理解 JavaScript Errors 和 Stack Traces - 前端 - 掘金譯者注:本文作者是著名 JavaScript BDD 測試框架 Chai.js 源碼貢獻者之一,Chai.js 中會遇到很多異常處理...

    you_De 評論0 收藏0
  • 前端空間 - 收藏集 - 掘金

    摘要:封裝手寫的方筆記使用檢測文件前端掘金副標(biāo)題可以做什么以及使用中會遇到的坑。目的是幫助人們用純中文指南實現(xiàn)復(fù)選框中多選功能前端掘金作者緝熙簡介是推出的一個天挑戰(zhàn)。 深入理解 JavaScript Errors 和 Stack Traces - 前端 - 掘金譯者注:本文作者是著名 JavaScript BDD 測試框架 Chai.js 源碼貢獻者之一,Chai.js 中會遇到很多異常處理...

    lwx12525 評論0 收藏0
  • 信小程序資源匯總

    awesome-github-wechat-weapp 是由OpenDigg整理并維護的微信小程序開源項目庫集合。我們會定期同步上的項目到這里,也歡迎各位 UI組件開發(fā)框架實用庫開發(fā)工具服務(wù)端項目實例Demo UI組件 weui-wxss ★1873 - 同微信原生視覺體驗一致的基礎(chǔ)樣式庫zanui-weapp ★794 - 好用易擴展的小程序 UI 庫wx-charts ★449 - 微信小程...

    Olivia 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<