zoukankan      html  css  js  c++  java
  • TouchWX Calender代码注释

    Dater.js

      1 /**
      2  * 换算某月的上个月,下月,本月的月信息,日历写死展示42天,
      3  *     可以通过更改:
      4  *           var nextlen = 42 - (prem.length + getMonthDay[m - 1]); 42改成35
      5  *     上月和下月不显示数据可以可以注释掉相应月的赋值代码,修改此对象:
      6  *             this.monthDays = {
      7                   preMonthDays: prem,  //上月的天
      8                   thisMonthDays: im,   //本月的天
      9                   nextMonthDays: nextm, //下月的天
     10                   day: d,
     11                   month: m,
     12                   year: y
     13                 }
     14  */
     15 export default function Dater (y, m, d) {
     16   var date = new Date()
     17 
     18   // 获取年,月,天
     19   var y = y || date.getFullYear(),
     20     m = m || date.getMonth() + 1,
     21     d = d || date.getDate()
     22 
     23   // 是否为闰年,闰年能被4和400整除,不能被100整除  
     24   var isLeapYear = function (years) {
     25     return !!((years % 4 == 0 && years % 100 !== 0) || (years % 400 === 0))
     26   }
     27 
     28   // 获取月的一号是星期几, 0是星期日
     29   var getFirstDay = function (y, m, d) {
     30     var d = new Date(y, m, d)
     31     d.setDate(1)
     32     return d.getDay()
     33   }
     34 
     35   // 每月有多少天,一年12月的天数
     36   var getMonthDay = [31, isLeapYear(y) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
     37   
     38   // prem 上月的天信息,im本月的天信息, nextm下个月的天信息, lastmd上个月的天数
     39   var prem = [], im = [], nextm = [], lastmd = getMonthDay[m - 1 - 1]
     40 
     41   //设置上月的天数信息
     42   // 该月的1号是不是周日,
     43   if (getFirstDay(y, m - 1, d) === 0) {
     44     for (var i = 6; i >= 0; i--) {
     45       prem[6 - i] = lastmd - i
     46     }
     47   } else {
     48     for (var i = getFirstDay(y, m - 1, d); i > 0; i--) {
     49       prem[getFirstDay(y, m - 1, d) - i] = lastmd - i + 1
     50     }
     51   }
     52 
     53   // 设置本月的天数信息
     54   for (var i = 0; i < getMonthDay[m - 1]; i++) {
     55     im[i] = i + 1
     56   }
     57 
     58   // 设置下月的天信息
     59   // 日历展示42天
     60   var nextlen = 42 - (prem.length + getMonthDay[m - 1])
     61   for (var i = 0; i < nextlen; i++) {
     62     nextm[i] = i + 1
     63   }
     64 
     65 
     66   if (isNaN(prem[0])) {
     67     for (let i = 0; i < prem.length; i++) {
     68       prem[i] = 31 - prem.length + i + 1
     69     }
     70   }
     71 
     72 
     73   this.monthDays = {
     74     preMonthDays: prem,  //上月的天
     75     thisMonthDays: im,   //本月的天
     76     nextMonthDays: nextm, //下月的天
     77     day: d,
     78     month: m,
     79     year: y
     80   }
     81 
     82   // 没有看明白此算法的作用,在日历中没有使用this.weekDays数据
     83   var arr = []
     84   for (var i = 0; i < 7; i++) {
     85     var weekDate = new Date()
     86     weekDate.setFullYear(y)
     87     weekDate.setMonth(m - 1)
     88     weekDate.setDate(d - 1)
     89     var weekday = weekDate.getDay() // 获取星期几0-6
     90     var newday = weekDate.getDate() + 1 - weekday + i  //
     91     weekDate.setDate(newday - 1)
     92     arr.push({
     93       year: weekDate.getFullYear(),
     94       month: weekDate.getMonth() + 1,
     95       day: weekDate.getDate() + 1
     96     })
     97   }
     98   this.weekDays = {
     99     data: arr,
    100     day: d,
    101     month: m,
    102     year: y
    103   }
    104   // var array = []
    105   // for (var i = 0; i < prem.length; i++) {
    106   //   array.push(`${y}-${m - 1}-${prem[i]}`)
    107   // }
    108   // for (var i = 0; i < im.length; i++) {
    109   //   array.push(`${y}-${m}-${im[i]}`)
    110   // }
    111   // for (var i = 0; i < nextm.length; i++) {
    112   //   array.push(`${y}-${m + 1}-${nextm[i]}`)
    113   // }
    114   // console.log(array)
    115   // var arrayIndex = 0;
    116   // for (var i = 0; i < array.length; i++) {
    117   //   if(m === Number(array[i].split('-')[1]) && d === Number(array[i].split('-')[2])) {
    118   //     arrayIndex = i
    119   //     break
    120   //   }
    121   // }
    122 };
    123 
    124 Dater.change = function (anchor, type, time) {
    125   var date = new Date()
    126   date.setFullYear(anchor.year, anchor.month - 1, anchor.day)
    127   switch (type) {
    128     case 'y': {
    129       date.setFullYear(date.getFullYear() + time)
    130       break
    131     }
    132     case 'm': {
    133       date.setMonth(date.getMonth() + time)
    134       break
    135     }
    136     case 'w': {
    137       date.setDate(date.getDate() + time * 7)
    138       break
    139     }
    140     case 'd': {
    141       date.setDate(date.getDate() + time)
    142       break
    143     }
    144   }
    145   return {
    146     year: date.getFullYear(),
    147     month: date.getMonth() + 1,
    148     day: date.getDate()
    149   }
    150 }
    151 
    152 Dater.getTodayAnchor = function () {
    153   var date = new Date()
    154   return {
    155     year: date.getFullYear(),
    156     month: date.getMonth() + 1,
    157     day: date.getDate()
    158   }
    159 }
    160 Dater.AnchorToDayString = function (anchor) {
    161   // return '' + anchor.year + (anchor.month < 10 ? '0' : '') + anchor.month + (anchor.day < 10 ? '0' : '') + anchor.day
    162   // console.log( `${anchor.year}/${anchor.month < 10 ? '0': ''}${anchor.month}/${anchor.day < 10 ? '0' : ''}${anchor.day}`)
    163   return `${anchor.year}/${anchor.month < 10 ? '0': ''}${anchor.month}/${anchor.day < 10 ? '0' : ''}${anchor.day}`
    164 }

    Calendar.wx

      1 <script>
      2 import props from './props.js'
      3 import Dater from '../../libs/date.js'
      4 import OTS from '../../libs/objectToStyle.js'
      5 var moment = require('moment')
      6 
      7 export default {
      8   config: {
      9     usingComponents: { }
     10   },
     11   behaviors: [props],
     12   data: {
     13     selectItem: {},
     14     dayMap: {},
     15     monthsArray: [],
     16     oldItem: undefined,
     17     scrollTop: 0,
     18     oldRangeLeftItem: undefined,
     19     oldRangeRightItem: undefined,
     20     heightCount: 50,
     21     monthSwiperIndex: 0,
     22     myItem: undefined
     23   },
     24   attached () {
     25     console.log('attached')
     26 
     27 
     28   },
     29   ready () {
     30     this.reAttached ()
     31 
     32     console.log(this.data.dayMap)
     33 
     34   },
     35   methods: {
     36     reAttached () {
     37 
     38     // 获取开始月到结束月之前所有的月信息
     39     this.data.monthsArray.splice(0, this.data.monthsArray.length)
     40     let startMonthAnchor
     41     let endMonthAnchor
     42     if (isNaN(  Number(this.data.dateRange[0]))) { // 字符串
     43       startMonthAnchor = this.data.dateRange[0] + '/01'
     44       endMonthAnchor = this.data.dateRange[1] + '/01'
     45     } else {
     46       startMonthAnchor = moment().subtract(this.data.dateRange[0], 'months').format('YYYY/MM') + '/01'
     47       endMonthAnchor = moment().add(this.data.dateRange[1], 'months').format('YYYY/MM') + '/01'
     48     }
     49 
     50     console.log(startMonthAnchor, endMonthAnchor)
     51 
     52     for (let i = 0;; i++) {
     53       let year = moment(startMonthAnchor).year()  //
     54       let month = moment(startMonthAnchor).month() + 1  //月,月在date中用0-11表示十二个月
     55       let day = moment(startMonthAnchor).date() //
     56 
     57       let startMonthDater = new Dater(year, month, day).monthDays // Dater使用的是正常月份
     58       let monthArray = this.getMonthArray(startMonthDater, i)
     59       monthArray.monthIndex = i
     60       this.data.monthsArray.push(monthArray)
     61       if (moment(startMonthAnchor).isSame(endMonthAnchor, 'month')) { 
     62         break
     63       }
     64       startMonthAnchor = moment(startMonthAnchor).add(1, 'month')
     65     }
     66 
     67     if (this.data.value) {
     68       if (typeof this.data.value === 'string') {  
     69         let dIndex = this.momentTransToItem(moment(this.data.value)).dayIndex
     70         let mIndex = this.momentTransToItem(moment(this.data.value)).monthIndex
     71         this.selectSingle(mIndex, dIndex)
     72       } else {
     73         let dIndex = this.momentTransToItem(moment(this.data.value[0])).dayIndex
     74         let mIndex = this.momentTransToItem(moment(this.data.value[0])).monthIndex
     75         this.selectRange(mIndex, dIndex, true)
     76         mIndex = this.momentTransToItem(moment(this.data.value[1])).monthIndex
     77         dIndex = this.momentTransToItem(moment(this.data.value[1])).dayIndex
     78         this.selectRange(mIndex, dIndex)
     79       }
     80     }
     81     this.setData({
     82       monthsArray: this.data.monthsArray,
     83       monthTitleStyle: OTS(this.data.monthTitleStyle),
     84       calendarWrapStyle: OTS(this.calendarWrapStyleObj())
     85     })
     86     // }, 3000);
     87 
     88     },
     89     changeHandler (e) {
     90       let index = e.detail.current
     91       // console.log()
     92       this.triggerEvent('monthchange', 
     93       `${this.data.monthsArray[index].year}/${this.data.monthsArray[index].month >= 10 ? '' :'0'}${this.data.monthsArray[index].month}`)
     94     },
     95     calendarWrapStyleObj () {
     96       let style = {}
     97       style.height = this.data.height + 'px'
     98       return style
     99     },
    100     itemTransToMoment (item) {
    101       if (item.day) {
    102         return moment(`${item.year}/${item.month}/${item.day}`)
    103       } else {
    104         return moment(`${item.year}/${item.month}`)
    105       }
    106     },
    107     momentTransToItem (moment) {
    108       for (let i = 0; i < this.data.monthsArray.length; i++) {
    109         for (let j = 0; j < this.data.monthsArray[i].data.length; j++) {
    110           if (
    111             this.data.monthsArray[i].data[j].isThisMonth &&
    112             moment.isSame(this.itemTransToMoment(this.data.monthsArray[i].data[j]))) {
    113             return this.data.monthsArray[i].data[j]
    114           }
    115         }
    116       }
    117     },
    118     inRangeSelect (rightItem, startI, endI, select) {
    119       for (let i = startI; i <= endI ; i++) {
    120         for (let j = 0; j < this.data.monthsArray[startI].data.length; j++) {          
    121           if (this.data.monthsArray[i].data[j].isThisMonth &&
    122           this.itemTransToMoment(this.data.monthsArray[i].data[j]).isAfter(this.itemTransToMoment(this.data.oldRangeLeftItem), 'day') && 
    123           this.itemTransToMoment(this.data.monthsArray[i].data[j]).isBefore(this.itemTransToMoment(rightItem), 'day')) {
    124             if (select) {
    125               this.data.monthsArray[i].data[j].isInRange = true
    126             } else {
    127               this.data.monthsArray[i].data[j].isInRange = false
    128             }
    129           }
    130           if (this.itemTransToMoment(this.data.monthsArray[i].data[j]).isSame(this.itemTransToMoment(rightItem), 'day')) {
    131             break
    132           }
    133         }
    134       }
    135     },
    136     selectRange (mIndex, dIndex, trans) {
    137       let selectItem = this.data.monthsArray[mIndex].data[dIndex]
    138       let selectMoment = this.itemTransToMoment(selectItem)
    139       if (selectItem.isPastDay && this.data.disablePastDays) {
    140         this.triggerEvent('failed')
    141         return
    142       }
    143       if (selectItem.isForeDay && this.data.disableForeDays) {
    144         this.triggerEvent('failed')
    145         return
    146       }
    147       if (selectItem.isToday && !this.data.canSelectToday) {
    148         this.triggerEvent('failed')
    149         return
    150       }
    151       if (!this.data.oldRangeLeftItem && !this.data.oldRangeRightItem) { // 两边都没有
    152         selectItem.isRangeLeft = true // 变颜色
    153         this.data.oldRangeLeftItem = selectItem // 老东西
    154         this.triggerEvent('selectedstart', selectItem.value)
    155       } else if (this.data.oldRangeLeftItem, !this.data.oldRangeRightItem) { //左有右没有
    156         // maxRange选取
    157         if (this.data.maxRange) {
    158           if (this.itemTransToMoment(this.data.oldRangeLeftItem).add(this.data.maxRange, 'day').isBefore(selectMoment,'day')) {
    159             this.triggerEvent('failed')
    160             return
    161           }
    162         }
    163         if (this.itemTransToMoment(this.data.oldRangeLeftItem).isAfter(selectMoment, 'day')) { // 如果选择在之前
    164         // this.data.oldRangeLeftItem = this.
    165         this.data.oldRangeLeftItem.isRangeLeft = false
    166         selectItem.isRangeLeft = true // 变颜色
    167         this.data.oldRangeLeftItem = selectItem
    168         this.triggerEvent('selectedstart', selectItem.value)
    169         } else if (this.itemTransToMoment(this.data.oldRangeLeftItem).isBefore(selectMoment, 'day')) { // 如果选择在之后
    170 
    171           selectItem.isRangeRight = true // 变颜色
    172           this.data.oldRangeRightItem = selectItem // 老东西
    173           let startI = this.data.oldRangeLeftItem.monthIndex
    174           let endI = selectItem.monthIndex
    175           this.inRangeSelect(selectItem, startI, endI, true)
    176           this.triggerEvent('selectedend', selectItem.value)
    177         } else {
    178           selectItem.isRangeLeft = false // 变颜色
    179           this.data.oldRangeLeftItem = undefined
    180         }
    181       } else { //如果都有
    182         let startI = this.data.oldRangeLeftItem.monthIndex
    183         let endI = this.data.oldRangeRightItem.monthIndex
    184         this.inRangeSelect(this.data.oldRangeRightItem, startI, endI, false)
    185         this.data.oldRangeLeftItem.isRangeLeft = false
    186         this.data.oldRangeRightItem.isRangeRight = false
    187         this.data.oldRangeRightItem = undefined
    188         selectItem.isRangeLeft = true // 变颜色
    189         this.data.oldRangeLeftItem = selectItem // 老东西
    190         this.triggerEvent('selectedstart', selectItem.value)
    191       } 
    192       if (trans) {
    193         this.setData({
    194           monthSwiperIndex:mIndex
    195         })
    196       }
    197     },
    198     selectSingle (mIndex, dIndex) {
    199       let selectItem = this.data.monthsArray[mIndex].data[dIndex]
    200 
    201       if (selectItem.isPastDay && this.data.disablePastDays) {
    202         this.triggerEvent('failed')
    203         return
    204       }
    205       if (selectItem.isForeDay && this.data.disableForeDays) {
    206         this.triggerEvent('failed')
    207         return
    208       }
    209       if (selectItem.isToday && !this.data.canSelectToday) {
    210         this.triggerEvent('failed')
    211         return
    212       }
    213       
    214       if (this.data.oldItem) {
    215         this.data.oldItem.isClicked = false
    216       }
    217       this.data.monthsArray[mIndex].data[dIndex].isClicked = true
    218       
    219       
    220       this.data.oldItem = this.data.monthsArray[mIndex].data[dIndex]
    221 
    222       
    223       this.data.selectItem = this.data.oldItem
    224       this.setData({
    225         monthSwiperIndex:mIndex,
    226         myItem: this.data.selectItem,
    227         oldItem: this.data.oldItem
    228       })
    229       this.triggerEvent('change', selectItem.value)
    230     },
    231     touchStartHandler (e) {
    232 
    233       console.time('a')
    234       let mIndex = e.currentTarget.dataset.monthIndex
    235       let dIndex = e.currentTarget.dataset.dayIndex
    236       let selectItem = this.data.monthsArray[mIndex].data[dIndex]
    237       if (selectItem.isThisMonth === false) {
    238         return
    239       }
    240       if (this.data.selectRangeMode) {
    241         this.selectRange(mIndex, dIndex)
    242       } else {
    243         this.selectSingle(mIndex, dIndex)
    244       }
    245       // this.setData({
    246       //   monthsArray: this.data.monthsArray
    247       // })
    248       console.timeEnd('a')
    249     },
    250     getMonthArray (date, monthIndex) {
    251       let monthArray = {}
    252       let lineCount = 0
    253       var count = 0
    254       monthArray.data = []
    255       monthArray.year = date.year
    256       monthArray.month = date.month
    257       for (let i = 0; i < date.preMonthDays.length; i++) {
    258         let obj = {}
    259         obj.day = date.preMonthDays[i]
    260         if (date.month === 1) {
    261           obj.month = 12
    262           obj.year = date.year - 1
    263         } else {
    264           obj.month = date.month - 1
    265           obj.year = date.year
    266         }
    267         obj.value = `${obj.year}/${obj.month < 10 ? '0' : ''}${obj.month}/${obj.day < 10 ? '0' : ''}${obj.day}`
    268 
    269 
    270         obj.isThisMonth = false    
    271         obj.isClicked = false
    272         obj.isRangeLeft = false
    273         obj.isRangeRight = false
    274         obj.isInRange = false
    275         obj.monthIndex = monthIndex
    276         obj.dayIndex = count
    277         this.data.dayMap[obj.value] = obj
    278         if ([0, 6].indexOf((moment(obj.value).weekday())) !== -1) {
    279           obj.isHoliday = true
    280         }
    281         monthArray.data.push(obj)
    282         count++
    283       }
    284       for (let i = 0; i < date.thisMonthDays.length; i++) {
    285         let obj = {}
    286         obj.day = date.thisMonthDays[i]
    287         obj.month = date.month
    288         obj.year = date.year
    289         obj.isThisMonth = true
    290         obj.isClicked = false
    291         obj.isRangeLeft = false
    292         obj.isRangeRight = false
    293         obj.isInRange = false
    294         obj.monthIndex = monthIndex
    295         obj.dayIndex = count
    296         obj.value = `${obj.year}/${obj.month < 10 ? '0' : ''}${obj.month}/${obj.day < 10 ? '0' : ''}${obj.day}`
    297         if ([0, 6].indexOf((moment(obj.value).weekday())) !== -1) {
    298           obj.isHoliday = true
    299         }
    300         if (moment(`${obj.year}/${obj.month}/${obj.day}`).isBefore(moment(), 'day')) {
    301           obj.isPastDay = true
    302           obj.isForeDay = true
    303           obj.isToday = false
    304         } else if (moment(`${obj.year}/${obj.month}/${obj.day}`).isAfter(moment(), 'day')) {
    305           obj.isPastDay = false
    306           obj.isForeDay = true
    307           obj.isToday = false
    308         } else {
    309           obj.isPastDay = false
    310           obj.isForeDay = false
    311           obj.isToday = true
    312         }
    313         monthArray.data.push(obj)
    314         count++
    315         this.data.dayMap[obj.value] = obj
    316       }
    317       // if (date.nextMonthDays.length >= 7) {
    318       //   date.nextMonthDays.splice(date.nextMonthDays.length - 7, 7)
    319       //   lineCount++
    320       // }
    321 
    322       for (let i = 0; i < date.nextMonthDays.length; i++) {
    323         let obj = {}
    324         obj.day = date.nextMonthDays[i]
    325 
    326         if (date.month === 12) {
    327           obj.month = 1
    328           obj.year = date.year + 1
    329         } else {
    330           obj.month = date.month + 1
    331           obj.year = date.year
    332         }
    333         obj.isThisMonth = false
    334         obj.isClicked = false
    335         obj.isRangeLeft = false
    336         obj.isRangeRight = false
    337         obj.isInRange = false
    338         obj.monthIndex = monthIndex
    339         obj.dayIndex = count
    340         obj.value = `${obj.year}/${obj.month < 10 ? '0' : ''}${obj.month}/${obj.day < 10 ? '0' : ''}${obj.day}`
    341         if ([0, 6].indexOf((moment(obj.value).weekday())) !== -1) {
    342           obj.isHoliday = true
    343         }
    344         monthArray.data.push(obj)
    345         count++
    346         this.data.dayMap[obj.value] = obj
    347 
    348       }
    349       monthArray.positionY = this.data.heightCount
    350 
    351 
    352       monthArray.value = `${date.year}/${date.month > 10 ? '' : '0'}${date.month}`
    353 
    354 
    355 
    356       if (lineCount === 0) {
    357         monthArray.monthHeight = 350
    358       } else if (lineCount === 1) {
    359         monthArray.monthHeight = 300
    360       } else {
    361         monthArray.monthHeight = 250
    362       }
    363       this.data.heightCount += monthArray.monthHeight
    364       return monthArray
    365     },
    366   }
    367 }
    368 
    369 </script>
    View Code
  • 相关阅读:
    V-Box
    One CLI for webpack must be installed. These are recommended choices, delivered as separate packages:
    获取用户地理位置
    错误 CS0234 命名空间“Microsoft”中不存在类型或命名空间名“Reporting”(是否缺少程序集引用?)
    “/Reports”应用程序中的服务器错误。
    微信公众号关注界面的菜单栏跟实际的菜单栏不一致
    错误 CS8107 C# 7.0 中不支持功能“xxxxxx”。请使用 7.1 或更高的语言版本。
    已经安装了 AccessDatabaseEngine.exe,还是报错
    没有足够的内存继续执行程序(mscorlib)
    坑,坑,
  • 原文地址:https://www.cnblogs.com/hengwu/p/9778189.html
Copyright © 2011-2022 走看看