• 技术文章 >微信小程序 >小程序开发

    日历签到小程序的实现

    王林王林2021-01-26 09:43:08转载1201

    php入门到就业线上直播课:进入学习

    首先我们来看一下最终的效果图:

    (学习视频分享:编程入门

    02f7ed03fd91f608e8a91c99c9203bc.png

    下面我们来介绍实现思路:

    首先,我们要获取的无非就是每一个格子里面的数据。

    先获取月,然后点击月切换到另一个月,到了边界线的时候到了上/下年即可。

    那么,怎么获取月的数据呢,可以看到月第一天都是1开始,然后xx天,比如1月31天,我们把它枚举出来。

    但是月份受到年份影响,所以计算是否闰年就完成了。

    上代码
    获取这个月的7*5列表

    let getMothList = (year, month) => {
        var star = new Date(Date.UTC(year, month - 1, 1)).getDay()
        let mn = getMothNum(year)[month - 1]
        var res = []
        var row = []
        new Array(35)
            .fill('')
            .map((_, i) => i - star + 1)
            .map(e => 
                (e > 0 && e <= mn)
                ? ({
                    date: `${year}/${month}/${e}`,
                    number: e 
                })
                : (null)
            )
            .forEach((item, i) => {
                row.push(JSON.parse(JSON.stringify(item)))
                if((i + 1) % 7 == 0){
                    res.push(row)
                    row = []
                }
            })
        return res
    }

    然后获取月

    var getMaxY = y =>  Boolean(
    	y % 4 ==0 && y % 100 != 0 || y % 400==0
    )
    var getAugNum = n => getMaxY(n) ? 29 : 28
    // --获取年对应的月份
    var getMothNum = y => ([ 31, getAugNum(y), 31, 30,  31, 30, 31,31, 30, 31, 30, 31 ])

    我上面js就这些了(还差上下月切换的没说哈)

    但是少了中文的月份,有需要的这个可以再匹配

    var mothZh = ['一','二','三','四','五','六','七','八','九','十','十一','十二'].map(e => e + '月')

    然后就是上下月月份了

      up(e){
        var data = e.currentTarget.dataset
        if(data.data == '上'){
          if(this.data.dateM > 1){
            var dateM = this.data.dateM
            var dateY = this.data.dateY
            this.setDate(dateY, dateM - 1)
          }else{
            var dateY = this.data.dateY
            this.setDate(dateY - 1, 12)
          }
        }
      },
      down(e){
        var data = e.currentTarget.dataset
        if(data.data == '下'){
          if(this.data.dateM < 12){
            var dateM = this.data.dateM
            var dateY = this.data.dateY
            this.setDate(dateY, dateM + 1)
          }else{
            var dateY = this.data.dateY
            this.setDate(dateY + 1, 1)
          }
        }
      },

    上下月操作好了就是更新数据了,更新数据的时候,因为小程序不能在view里面写逻辑,所以我们在mpa里面操作(这是我的业务逻辑,你们不用管他,我之所以放出来是方便大家查看)

      setDate(dateY, dateM){
        var date_list = getMothList(dateY, dateM)
        .map(e => !e ? e : e.map(day => {
          var cat_date = this.data.cat_date
          return !day ? day : {
            ...day,
            className: this.data.chckin_list.indexOf(day.date) != -1 ? 'checkin' : '',
            sign: day.date == [cat_date.y, cat_date.m, cat_date.d].join('/'),
            maxToday: +(Date.UTC(day.date.split('/')[0], day.date.split('/')[1] - 1, +(day.date.split('/')[2])))
              > Date.UTC(new Date().getFullYear(), new Date().getMonth(), new Date().getDate()),
          }
        }))
        this.setData(({
          dateY,
          dateM,
          date_list,
        }))
        // 获取月和修改的时候,获取签到列表
        this.setSign(dateY, dateM)
        // console.log(date_list)
      },

    然后会注意到,这里有一个chckin_list,这个就是要渲染出来的啦。 view

    <view class="week">
                <view class="flex" wx:for="{{date_list}}" wx:key="index" wx:for-item="row">
                    <view 
                    class="day {{day.maxToday ? 'maxToday' : ''}}" 
                    wx:for="{{row}}" wx:for-index="row_idx" wx:for-item="day" wx:key="row_idx"
                    bind:tap="tapDay"
                    data-day="{{day.date}}"
                    >
                        <block wx:if="{{day}}">
                            <text class="block to_day_block  {{day.sign ? 'select_date' : ''}}" wx:if="{{toDay == day.date}}">今</text>
                            <text class="block  {{day.sign ? 'select_date' : ''}}" wx:else>{{day.number}}</text>
                        </block>
                        <view wx:if="{{day.className}}" class="{{day.className}}">已签</view>
                    </view>
                </view>
            </view>

    上面是我的业务逻辑,其实只需要if,day就行了,因为除了空的,其他都需要渲染。但是一般业务也有是否签到啊,今天以后的灰色不可点击啊(这里没有不可点击是因为用css禁用点击)

    其他

    之所以没放css,大家css还是自己写吧,如果真有需要,在下面评论。

    哦, 如果要看效果,去小程序里面搜索《初九背单词》,点击日历(一个是首页完成今日任务,一个是我的->背单词天数)

    (如果有需要,我可以说下签到后台是怎么做的,nodejs)

    --好了--

    就这样了,晚安

    --- 更新部分---

    (楼下有人提醒(毛毛饭),3月最后一个31号的不见了,我检查了下,发现被剪切了,因为5 * 7并不能完整展示出来)

    修复后的图

    f85ba9b421b1d0a80f5bc39aa36888f.png

    改动部分就是,动态加载行。

    基于上面的代码,添加一个判断

    4645e40faf6fd7121cdc60f20391ab7.png

    先在前面的35改成6*7。因为多加了一行。 然后再判断是否有空余位置,去掉即可。

     row.map(e => e || '').join('') !== ''

    --完--

    相关推荐:小程序开发教程

    以上就是日历签到小程序的实现的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:掘金,如有侵犯,请联系admin@php.cn删除

    前端(VUE)零基础到就业课程:点击学习

    清晰的学习路线+老师随时辅导答疑

    自己动手写 PHP MVC 框架:点击学习

    快速了解MVC架构、了解框架底层运行原理

    专题推荐:日历 小程序
    上一篇:怎么将小程序分享到朋友圈 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • ❤️‍🔥共22门课程,总价3725元,会员免费学• ❤️‍🔥接口自动化测试不想写代码?• 如何基于moment实现日期可左右滑动的日历?• ​jsp日历表格怎么做• php日历如何实现• 如何使用js实现简单日历效果
    1/1

    PHP中文网