国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

微信小程序:手寫(xiě)日歷組件

genefy / 1947人閱讀

摘要:一前言最近公司要做一個(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ù)。

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

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

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/93094.html

相關(guān)文章

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

    摘要:最近在做微信小程序項(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)目需要,自己去挖...

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

    摘要:手把手教你做個(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。...

    shinezejian 評(píng)論0 收藏0
  • 前端空間 - 收藏集 - 掘金

    摘要:封裝手寫(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ì)遇到很多異常處理...

    you_De 評(píng)論0 收藏0
  • 前端空間 - 收藏集 - 掘金

    摘要:封裝手寫(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ì)遇到很多異常處理...

    lwx12525 評(píng)論0 收藏0
  • 信小程序資源匯總

    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 - 微信小程...

    Olivia 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<