看小效果哈
首先,我們要獲取的無(wú)非就是每一個(gè)格子里面的數(shù)據(jù)。
先獲取月,然后點(diǎn)擊月切換到另一個(gè)月,到了邊界線的時(shí)候到了上/下年即可。
那么,怎么獲取月的數(shù)據(jù)呢,可以看到月第一天都是1開始,然后xx天,比如1月31天,我們把它枚舉出來(lái)。
但是月份受到年份影響,所以計(jì)算是否閏年就完成了。
上代碼
獲取這個(gè)月的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
}
復(fù)制代碼
然后獲取月
var getMaxY = y => Boolean(
y % 4 ==0 && y % 100 != 0 || y % 400==0
)
var getAugNum = n => getMaxY(n) ? 29 : 28
// --獲取年對(duì)應(yīng)的月份
var getMothNum = y => ([ 31, getAugNum(y), 31, 30, 31, 30, 31,31, 30, 31, 30, 31 ])
復(fù)制代碼
我上面js就這些了(還差上下月切換的沒說(shuō)哈)
但是少了中文的月份,有需要的這個(gè)可以再匹配
var mothZh = ['一','二','三','四','五','六','七','八','九','十','十一','十二'].map(e => e + '月')
復(fù)制代碼
然后就是上下月月份了
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)
}
}
},
復(fù)制代碼
上下月操作好了就是更新數(shù)據(jù)了,更新數(shù)據(jù)的時(shí)候,因?yàn)樾〕绦虿荒茉趘iew里面寫邏輯,所以我們?cè)趍pa里面操作(這是我的業(yè)務(wù)邏輯,你們不用管他,我之所以放出來(lái)是方便大家查看)
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,
}))
// 獲取月和修改的時(shí)候,獲取簽到列表
this.setSign(dateY, dateM)
// console.log(date_list)
},
復(fù)制代碼
然后會(huì)注意到,這里有一個(gè)chckin_list,這個(gè)就是要渲染出來(lái)的啦。 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>
復(fù)制代碼
上面是我的業(yè)務(wù)邏輯,其實(shí)只需要if,day就行了,因?yàn)槌丝盏?,其他都需要渲染。但是一般業(yè)務(wù)也有是否簽到啊,今天以后的灰色不可點(diǎn)擊?。ㄟ@里沒有不可點(diǎn)擊是因?yàn)橛胏ss禁用點(diǎn)擊)
之所以沒放css,大家css還是自己寫吧,如果真有需要,在下面評(píng)論。
哦, 如果要看效果,去小程序里面搜索,《初九背單詞》,點(diǎn)擊日歷(一個(gè)是首頁(yè)完成今日任務(wù),一個(gè)是我的->背單詞天數(shù))
(如果有需要,我可以說(shuō)下簽到后臺(tái)是怎么做的,nodejs)
--好了--
就這樣了,晚安
工作日 8:30-12:00 14:30-18:00
周六及部分節(jié)假日提供值班服務(wù)