描述

切换月份, 当天文案为今天, 日期背景变色, 日期红点标识, 点击选中日期.

效果


源码

calendar.wxml

<view class="component">
<view class="header">
<view bindtap="handlePrevMonthClick">{{'<'}}</view>
<view>{{year}}年{{month}}月</view>
<view bindtap="handleNextMonthClick">></view>
</view>
<view>
<view class="week">周一</view>
<view class="week">周二</view>
<view class="week">周三</view>
<view class="week">周四</view>
<view class="week">周五</view>
<view class="week">周六</view>
<view class="week">周日</view>
</view>
<view class="daybox">
<block wx:for="{{dayList}}" wx:key="{{index}}">
<view wx:if="{{item.day}}" class="day {{item.day === day ? 'day-checked': ''}} {{item.bg ? 'day-bg' : ''}}" data-day="{{item.day}}" bindtap="handleDayClick">
<view>{{item.isToday ? '今天' : item.day}}</view>
<view class="point" wx:if="{{item.point}}"></view>
</view>
<view wx:else class="day"></view>
</block>
</view>
</view>

calendar.js

const weekNameMap = ['周日', '周一', '周二', '周三', '周四', '周五', '周六'];

Component({
properties: {
mydate: String, // 选中的天 Date String 格式
mylist: Array,
}, data: {
year: null,
month: null,
day: null,
list: [],
}, lifetimes: {
attached: function () {
const now = new Date();
this.setData({
year: now.getFullYear(),
month: now.getMonth() + 1,
day: now.getDate(),
}, this.calcDayList)
},
}, observers: {
'mydate': function (mydate) {
let date = new Date(mydate);
this.setData({
year: date.getFullYear(),
month: date.getMonth() + 1,
day: date.getDate(),
}, this.calcDayList);
}, 'mylist': function (mylist) {
this.setData({ list: mylist }, this.calcDayList);
},
}, methods: { // 获取当月共多少天
getThisMonthDays: function (year, month) {
return new Date(year, month, 0).getDate()
}, // 获取当月第一天星期几 0 星期日
getFirstDayOfWeek: function (year, month) {
return new Date(Date.UTC(year, month - 1, 1)).getDay();
}, calcDayList: function () {
const { year, month, list, } = this.data; let totalDay = this.getThisMonthDays(year, month);
let firstDay = this.getFirstDayOfWeek(year, month); let dayList = [];
for (let i = 0; i < (totalDay); i++) {
dayList.push({
day: i + 1,
weekName: weekNameMap[(firstDay + i) % 7],
})
} // 向前添加
for (let i = 0; i < (firstDay || 7) - 1; i++) {
dayList.unshift({ day: 0, });
} // 向后添加
for (let i = 0; i < 42 - totalDay - ((firstDay || 7) - 1); i++) {
dayList.push({ day: 0, });
} // 当天
let now = new Date();
if (now.getFullYear() === year && now.getMonth() + 1 === month) {
(dayList.find(d => d.day === now.getDate()) || {}).isToday = true;
} // 业务数据处理
list.forEach(item => {
let find = dayList.find(d => d.day === item.day);
if (find) {
Object.assign(find, item);
}
}) this.setData({ dayList, });
}, // 点击上个月
handlePrevMonthClick: function () {
let year = this.data.year;
let month = this.data.month;
if (this.data.month === 1) {
year = this.data.year - 1;
month = 12;
} else {
month = this.data.month - 1;
}
this.handleDateChange({ year, month });
}, // 点击下个月
handleNextMonthClick: function () {
let year = this.data.year;
let month = this.data.month;
if (this.data.month === 12) {
year = this.data.year + 1;
month = 1;
} else {
month = this.data.month + 1;
}
this.handleDateChange({ year, month });
}, // 点击 天
handleDayClick: function (e) {
const { day } = e.currentTarget.dataset;
this.handleDateChange({ day })
}, // 处理日期变化
handleDateChange: function (time) {
const { year, month, day } = this.data;
let date = { year, month, day, ...time };
if (!this.data.mydate) {
this.setData({ ...date });
if (time.year || time.month) this.calcDayList();
}
this.triggerEvent('mydatechange', { date: new Date(`${date.year}/${date.month}/${date.day}`).toString() })
} }
})

calendar.wxss

.component {
background: #fff;
}
.header {
display: flex;
justify-content: space-around;
padding: 20rpx;
border-top: 1px solid #eee;
}
.header view {
height: 80rpx;
line-height: 80rpx;
font-size: 40rpx;
color: rgba(0, 0, 0, 0.85);
min-width: 100rpx;
}
.header view:nth-child(2n-1) {
font-size: 50rpx;
} .week {
display: inline-block;
width: 107rpx;
line-height: 2;
color: rgba(0, 0, 0, 0.45);
font-size: 28rpx;
text-align: center;
} .daybox {
display: flex;
flex-wrap: wrap;
border-bottom: 1px solid #eee;
} .day {
width: 107rpx;
height: 107rpx;
box-sizing: border-box;
text-align: center;
line-height: 2;
color: rgba(0, 0, 0, 0.85);
border: 4rpx solid #fff;
} .day:nth-child(7n), .day:nth-child(7n-1) {
color: #ff9b80;
} .day-checked {
border: 4rpx solid #ffa78f!important;
border-radius: 10rpx;
}
.day-bg {
background: #ffe9e4!important;
} .point {
width: 10rpx;
height: 10rpx;
border-radius: 50%;
background: #ff876d;
margin: 0 auto;
margin-top: 5rpx;
}

calendar.json

{
"component": true,
"usingComponents": {}
}

使用例子

参数 类型 默认值 说明
mydate? String 当天时间字符串 选中的日期
mylist? Array [] 当月数据
handleDateClick? ({ detail: { date } }) => void 点击某天的的回调

test.wxml

<calendar mydate="{{mydate}}" mylist="{{list}}" bindmydatechange="handleDateClick" />

test.js

Page({
data: {
mydate: new Date().toString(),
mylist: [
{ day: 1, // 当月天
bg: true, // 是否显示背景
point: true, // 是否显示圆点
},
{ day: 3, bg: true },
{ day: 4, bg: true },
{ day: 5, bg: true, point: true },
{ day: 6, bg: true, point: true },
{ day: 7, point: true },
{ day: 8, point: true },
{ day: 9, point: true },
]
}, handleDateClick: function ({ detail: { date } }) {
this.setData({ mydate: date });
}, })

test.json

{
"navigationBarTitleText": "demo",
"usingComponents": {
"calendar": "/components/calendar/calendar"
}
}

注意

组件properties的数据类型不支持Date, 所以日期使用字符串格式传递。

[组件封装]微信小程序-日历的更多相关文章

  1. [组件封装]微信小程序-图片批量上传照片墙

    描述 批量上传图片, 可设置最大上传个数, 可删除, 可设置默认值. 效果 源码 pictures-wall.wxml <view class="picturesWall"& ...

  2. [组件封装]微信小程序-底部弹框

    描述 模仿ios浏览器底部弹框效果. 遮罩层淡入淡出,弹框高度根据内容自适应. 效果 源码 popup-bottom.wxml <!-- popup-bottom.wxml --> < ...

  3. 详解封装微信小程序组件及小程序坑(附带解决方案)

    一.序 上一篇介绍了如何从零开发微信小程序,博客园审核变智障了,每次代码都不算篇幅,好好滴一篇原创,不到3分钟从首页移出来了.这篇介绍一下组件封装和我的踩坑历程. 二.封装微信小程序可复用组件 首先模 ...

  4. 简单封装微信小程序

    一.不同环境配置封装 新建config文件夹,根据自己有不同环境设置不同的js文件 具体js文件内容: exports.config = { requestHost: 'https://******. ...

  5. 封装微信小程序支付

    <?php /** * User: Eden * Date: 2019/3/21 * 共有内容 */ namespace Common\Service; use Think\Exception; ...

  6. 【组件】微信小程序input搜索框的实现

    开发小程序的过程,是一个学习知识,解决问题的过程,每当实现了一个需求,总会有很大的成就感,每天记录一个开发过程中的细节.实现效果如下: 官方参考链接:https://developers.weixin ...

  7. 微信小程序日历面板插件

    创建日历面板组件,在components目录下创建calendar文件夹 1.calendar.js // components/calendar/calendar.js var util = req ...

  8. 微信小程序日历课表

    最近项目中使用到了日历,在网上找了一些参考,自己改改,先看效果图 wxml <view class="date"> <image class="dire ...

  9. 微信小程序日历插件

    1/   wxml代码 <view class="timePick"> <picker mode="date" fields="mo ...

随机推荐

  1. python 组件

    组件:JQueryUI.EasyUI.BootStrap 每一个框架都要学习它们的规则.

  2. H2O theme for Jekyll

    正如我在微博上所说的,使用Jekyll半年以来一直没有令我满意的主题模板,所以开始计划自己写一套好看又好用的主题模板.设计之初就明确了极简主义,风格采用扁平化了,通过卡片式设计来进行区块分明的布局,参 ...

  3. Spotlight 监控工具使用

    监控MySQL数据库性能的工具:Spotlight on MySQL    <转载> 我们的服务器数据库:是在windows2003上. 这款工具非常的花哨,界面很漂亮,自带报警. 1.创 ...

  4. 这些科学家用DNA做的鲜为人知事,你估计都没见过!

    DNA世界的每一步都给人类带来奇妙甚至吃惊的发现.研究人员越来越多地探索和掌握了生命中的分子.生物与技术之间的界限以前所未有的方式模糊,有时甚至更糟.但DNA也为复杂疾病带来简单的答案,存储奇怪的文件 ...

  5. CPU踩点图

    CPU占比探测用js来检查当前系统cpu的占用比例,通过 setTimeout 的方式探测 CPU 的大小,这样可以实现网页游戏中动画等耗时操作的自动调节.这个原理是很多人都知道的,就是用JS来踩点. ...

  6. SQL中 decode()函数简介

    SQL中 decode()函数简介 今天看别人的SQL时看这里面还有decode()函数,以前从来没接触到,上网查了一下,还挺好用的一个函数,写下来希望对朋友们有帮助哈! decode()函数简介: ...

  7. 5G时代,什么将会消失?

    ​​5G时代说着说着就来了,当然,它不可能一撮而就,但正如4G.移动互联网和WIFI这些东西基本上是日益精进的水平,现如今饭馆的生意是否火爆,不仅仅在于其菜品和服务的质量,更在于他们有没有WIFI以及 ...

  8. GRE阅读

    界面和托福差不多,就是反一反 GRE先读文章!因为出题顺序不一致.另外,不能跳读!!每一句都要读,即使不是观点. 考察能力: 1 三秒版本 边读边概括 解决前面的抗遗忘能力 2 句间关系 取同 取反 ...

  9. CentOS7 部署K8S集群,最新版1.17.3-0

    小白在网上找了很多关于k8s集群部署的文档,但是版本老旧,到处踩坑,终于部署成功,记录下过程. 一.准备工作 虚拟机:VMware® Workstation 15 Pro Xhell 6:Xshell ...

  10. 一个简单的爬取b站up下所有视频的所有评论信息的爬虫

    心血来潮搞了一个简单的爬虫,主要是想知道某个人的b站账号,但是你知道,b站在搜索一个用户时,如果这个用户没有投过稿,是搜不到的,,,这时就只能想方法搞到对方的mid,,就是 space.bilibil ...