前言概述

本文介绍项目中常用到的日期格式--日历(总是显示一个月有效期选择),该实例分显示页面和日期组件页面两个页面:

实现过程

一、日期组件页面

1. 先实现页面效果,文件*.wxml和*.wxss代码如下:

1)需求只需要显示每个月自己的日期,由于该算法也显示了非自己月份的日期,所以需要过滤掉非当月的日期,在wxml使用wx:if="{{item.year === lists.dateYear && item.month === lists.dateMonth}}";

2)item.isDisable ? 'opacity30' : (item.year === selectDay.year && item.month === selectDay.month && item.day === selectDay.day?'select':'')实现原理,判断是否有效期(isDisable ),非有效期增加'opacity30'实现透明度30%效果;而有效期判断是否被选中,选中则增加'select'实现高亮效果;

<view class="calendar"><!-- 日历头部 --><view class="calendar-week"><view class="view">日</view><view class="view">一</view><view class="view">二</view><view class="view">三</view><view class="view">四</view><view class="view">五</view><view class="view">六</view></view><view wx:for="{{dateList}}" wx:for-item="lists" wx:key="dateList" class="day-box"><!-- 年月份信息 --><view class="title"><view>{{lists.dateYear}}年{{lists.dateMonth>9?lists.dateMonth:"0"+lists.dateMonth}}月</view></view><!-- 日历主体 --><view class="calendar-main"><view wx:for="{{lists.list}}" wx:key="index" class="day"><view wx:if="{{item.year === lists.dateYear && item.month === lists.dateMonth}}" class="day-item {{item.isDisable ? 'opacity30' : (item.year === selectDay.year && item.month === selectDay.month && item.day === selectDay.day?'select':'')}}" catchtap="selectChange" data-day="{{item.day}}" data-year="{{item.year}}" data-month="{{item.month}}" data-date-string="{{item.dateString}}" data-week-day="{{item.weekDay}}" data-isdisable="{{item.isDisable}}"><view class="text {{item.isWeekend ? 'orange' : (item.isToday ? 'blue' : '')}}">{{item.day}}</view><view class="remark blue" wx:if="{{item.isToday}}">今天</view><view class="remark orange" wx:if="{{item.isWeekend}}">休</view></view></view></view></view>
</view>
.calendar .title {font-weight: bold;text-align: center;padding: 20rpx 0 0;
}.calendar .calendar-week {display: flex;line-height: 50rpx;height: 50rpx;color: #808080;background-color: #F3F6F8;padding: 0 25rpx;
}.calendar .calendar-week .view {width: 100rpx;text-align: center;
}.calendar .calendar-main {padding: 10rpx 25rpx 0;display: flex;flex-wrap: wrap;
}.calendar .calendar-main .day {width: 100rpx;text-align: center;height: 100rpx;position: relative;
}.calendar .calendar-main .day .day-item {height: 70rpx;padding-top: 30rpx;
}.calendar .calendar-main .day .other-month {color: #ccc;display: none;
}.calendar .calendar-main .day .remark {font-size: 20rpx;
}.calendar .calendar-main .day .blue {color: #3D7AF5;
}.calendar .calendar-main .day .orange {color: #FA7014;
}.calendar .calendar-main .day .opacity30 {opacity: 0.3;
}.calendar .calendar-main .day .select {background-color: #3D7AF5;border-radius: 8rpx;
}.calendar .calendar-main .day .select .text {color: #fff;
}.calendar .calendar-main .day .select .remark {color: #fff;
}

2. 接下来实现交互逻辑,文件*.js代码实现如下:

1)dateInit函数用于获取渲染的日历主体信息和所需要的data各种数据;

2)onLoad实现获取当天日期并渲染主体数据,加了判断是否选中过日期来变化高亮日期天数;

3)selectChange函数用于点击后把选中日期数据传回上一页,并跳转到上一页。

import util from '../../utils/util.js'
Page({/*** 页面的初始数据*/data: {dateList: [], // 日历主体渲染数组nowDay: {}, // 今天日期selectDay: {}, // 选中时间},/*** 生命周期函数--监听页面加载*/onLoad: function (options) {// 获取当前日期信息let now = new Date();let nowDay = {year: now.getFullYear(),month: now.getMonth() + 1,day: now.getDate()}let selectDay = nowDay;// 存在选择数据情况if (options.selectDay != 0) {selectDay = JSON.parse(options.selectDay);}this.setData({nowDay,selectDay});this.dateInit(nowDay.year, nowDay.month);},// 日历主体的渲染方法dateInit(setYear, setMonth) {let dateList = []; // 需要遍历的日历数组数据// 循环两个月数据(2)for (let i = 0; i < 2; i++) {let now = new Date(setYear, setMonth - 1 + i); // 当前月份的1号let startWeek = now.getDay(); // 目标月1号对应的星期let dayNum = new Date(setYear, setMonth + i, 0).getDate(); // 当前月有多少天let forNum = Math.ceil((startWeek + dayNum) / 7) * 7; // 当前月跨越的周数let dateObj = {};let list = [];for (let j = 0; j < forNum; j++) {const now2 = new Date(now);now2.setDate(j - startWeek + 1);let obj = {};let day = now2.getDate();let month = now2.getMonth() + 1;let year = now2.getFullYear();let weekDay = now2.getDay();let nowDay = this.data.nowDay;let isDisable;// 用于判断本月小于今天,下个月大于今天的日期不能选择if (month == nowDay.month) {isDisable = (day < nowDay.day) ? true : false;} else {isDisable = (day >= nowDay.day) ? true : false;}obj = {day,month,year,weekDay,dateString: util.formatTime(now2),isToday: (year === nowDay.year && month === nowDay.month && day === nowDay.day) ? true : false, // 是否今天isWeekend: (weekDay === 0 || weekDay === 6) ? true : false, // 是否周末isDisable};list[j] = obj;}dateObj = {dateYear: now.getFullYear(),dateMonth: now.getMonth() + 1,list: list}dateList.push(dateObj);}this.setData({dateList: dateList})},// 一天被点击时selectChange(e) {const weekDay = e.currentTarget.dataset.weekDay;const isDisable = e.currentTarget.dataset.isdisable;// 非有效期不能预约if (isDisable) {util.showToast('请选择有效期', 'none');return false;}// 周末不能预约if (weekDay === 0 || weekDay === 6) {util.showToast('请选择非休息日', 'none');return false;}// 获取星期几let weeks = util.getWeeks(weekDay);const year = e.currentTarget.dataset.yearconst month = e.currentTarget.dataset.monthconst day = e.currentTarget.dataset.dayconst dateString = e.currentTarget.dataset.dateStringconst selectDay = {year: year,month: month,day: day,dateString: dateString + ' ' + weeks}console.log(selectDay);this.setData({selectDay: selectDay});// 传数据到上一个页面let pages = getCurrentPages(); // 获取当前所有页面let prevPage = pages[pages.length - 2]; // 获取上一个页面并传参prevPage.setData({selectDay});wx.navigateBack({delta: 1, // 返回上一级页面})}
})

二、显示页面

1. 先实现页面效果,文件*.wxml和*.wxss代码如下:

<view class="time-box"><view class="time-title">预约日期</view><view class="picker" bindtap="selectDate"><text>{{selectDay.dateString ? selectDay.dateString : dateString}}</text></view>
</view>
.time-box {padding: 32rpx 30rpx;display: flex;background-color: #fff;
}.time-box .time-title {color: #9A9A9A;margin-right: 73rpx;width: 200rpx;
}.time-box .picker {width: 400rpx;
}

2. 接下来实现交互逻辑,文件*.js代码实现如下:

Page({/*** 页面的初始数据*/data: {dateString: '2020-09-03 星期四'},/*** 生命周期函数--监听页面加载*/onLoad: function (options) {},// 选择日期selectDate: function() {wx.navigateTo({url: '../calendarModule/calendarModule?selectDay=' + JSON.stringify(this.data.selectDay ? this.data.selectDay : 0)})}
})

微信小程序之实现常用日期格式-日历格式(二)相关推荐

  1. 微信小程序之实现常用日期格式-月历滑动格式(三)

    前言概述 本文介绍项目中常用到的日期格式--月历滑动格式,顶部显示当前月的月历,默认选择当天的日期,且能滑动月历选择需要的日期: 实现过程 1. 先实现页面效果,文件*.wxml和*.wxss代码如下 ...

  2. 微信小程序,时间戳和日期格式互相转化

    微信小程序,时间戳转为日期格式 通常后台传递过来的都是时间戳,但是前台展示不能展示时间戳.就需要转化了. 功能说明: 微信小程序里,时间戳转化为日期格式,支持自定义. 拷贝至项目utils/utils ...

  3. 微信小程序将时间戳转为日期格式

    微信小程序,时间戳转为日期格式 在小程序中使用时间选择器时,获取到的时间可能是一个时间戳,这并不是我们想要的,这时候我们得将获取到的时间戳进行转换 将时间戳转为时间格式 //转换为时间格式format ...

  4. 微信小程序云开发——常用功能2:操作云数据库一键批量导入数据(导入json文件)

    微信小程序云开发--常用功能2:操作云数据库一键批量导入数据(导入json文件) 今天我们要添加100条数据.下面的过程是先创建一条记录,然后导出这条数据看json文件中是如何编辑字段的,然后仿照这个 ...

  5. 微信小程序中苹果iOS手机显示时间格式NaN不正确的问题

    项目场景: 实现安卓Android和苹果iOS中微信小程序显示订单时间信息 问题描述 微信小程序中苹果iOS手机显示时间格式NaN不正确的问题 原因分析: 安卓微信小程序显示正常,苹果按格式YYYY- ...

  6. 微信小程序 Notes | 常用开发事例(五)基于云平台导出 Excel

    历史文章回顾: 微信小程序 | 开发常用事例(一) 微信小程序 | 开发常用事例(二) 微信小程序 Notes | 开发常用事例(三) 微信小程序 Notes | 开发常用事例(四) 一.前言 最近一 ...

  7. 微信小程序入门之常用组件(04)

    常见组件 重点讲解微信小程序中常见的布局组件 view,text,rich-text,button,image,navigator,icon,swiper, radio,checkbox 等 一.vi ...

  8. 微信小程序开发 - 实现pdf、word等格式文件上传到后端的方法

    写在前面 我发现,微信的wx.uploadFile接口限制好多,而且会经常性出现bug,所以今天搜了一上午的资料, 看看能不能不要通过这个接口上传multipart/form-data格式的文件. 后 ...

  9. 微信小程序云开发实战:网上商城(二)

    微信小程序云开发实战:网上商城(二) 主页面 入口页面 云函数与云数据库 代码实现 云端实现 小程序端实现 选择UI组件库 WeUI Vant 整合UI组件库 以扩展包的方式引入weui 接下来 主页 ...

最新文章

  1. 燃爆了!天猫联合天一广场搞事情,800万宁波人坐不住了
  2. Object 标签遮挡 Div 显示
  3. BZOJ4403 序列统计—Lucas你好
  4. CSS实现div梯形分割
  5. halcon求取区域顶点
  6. 天大18年c语言离线作业,天大18秋C语言程序设计在线作业一辅导资料.docx-资源下载在线文库www.lddoc.cn...
  7. python做自动化界面_使用Python进行自动化测试如何切换窗口
  8. 转g代码教程_图深度学习入门教程(九)——图滤波神经网络模型
  9. 自然语言处理(NLP)与自然语言理解(NLU)的区别
  10. QQ轻游戏入门到精通OR放弃?
  11. 设计师的十大金科玉律
  12. C语言 execve()函数使用方法
  13. 迅雷下载边下边播设置为本地安装的浏览器
  14. cityengine笔记
  15. Java 中获取错误代码_错误代码:99999, 错误信息:无法获取到文件名
  16. ayit第十周训练g题
  17. Cadence Allegro解散Group组图文教程及视频演示
  18. Dynamo常用节点包下载方法
  19. AltiumDesigner绘制PCB(四)
  20. 3D segmentation of nasopharyngeal carcinoma from CT images using cascade deep learning

热门文章

  1. python调用webservice
  2. 试题 算法训练 一元三次方程求解---蓝桥杯
  3. ssm+jsp计算机毕业设计疫情期间北张村村民行程管理系统mwj1v(程序+lw+源码+远程部署)
  4. 服务器虚拟化优缺点总结
  5. Java操作linux脚本
  6. utf-8编码下,一个字符最多占几个字节?
  7. 用这个酷炫数据地图,老板口中别人家的可视化大屏你也能搞定
  8. unity学习小球酷跑
  9. Android数据存储:数据库基础,在Android应用中使用数据库,附加Menu菜单选项的一些说明
  10. C# 有道API翻译 查询单词详细信息