微信小程序之实现常用日期格式-日历格式(二)
前言概述
本文介绍项目中常用到的日期格式--日历(总是显示一个月有效期选择),该实例分显示页面和日期组件页面两个页面:
实现过程
一、日期组件页面
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. 先实现页面效果,文件*.wxml和*.wxss代码如下 ...
- 微信小程序,时间戳和日期格式互相转化
微信小程序,时间戳转为日期格式 通常后台传递过来的都是时间戳,但是前台展示不能展示时间戳.就需要转化了. 功能说明: 微信小程序里,时间戳转化为日期格式,支持自定义. 拷贝至项目utils/utils ...
- 微信小程序将时间戳转为日期格式
微信小程序,时间戳转为日期格式 在小程序中使用时间选择器时,获取到的时间可能是一个时间戳,这并不是我们想要的,这时候我们得将获取到的时间戳进行转换 将时间戳转为时间格式 //转换为时间格式format ...
- 微信小程序云开发——常用功能2:操作云数据库一键批量导入数据(导入json文件)
微信小程序云开发--常用功能2:操作云数据库一键批量导入数据(导入json文件) 今天我们要添加100条数据.下面的过程是先创建一条记录,然后导出这条数据看json文件中是如何编辑字段的,然后仿照这个 ...
- 微信小程序中苹果iOS手机显示时间格式NaN不正确的问题
项目场景: 实现安卓Android和苹果iOS中微信小程序显示订单时间信息 问题描述 微信小程序中苹果iOS手机显示时间格式NaN不正确的问题 原因分析: 安卓微信小程序显示正常,苹果按格式YYYY- ...
- 微信小程序 Notes | 常用开发事例(五)基于云平台导出 Excel
历史文章回顾: 微信小程序 | 开发常用事例(一) 微信小程序 | 开发常用事例(二) 微信小程序 Notes | 开发常用事例(三) 微信小程序 Notes | 开发常用事例(四) 一.前言 最近一 ...
- 微信小程序入门之常用组件(04)
常见组件 重点讲解微信小程序中常见的布局组件 view,text,rich-text,button,image,navigator,icon,swiper, radio,checkbox 等 一.vi ...
- 微信小程序开发 - 实现pdf、word等格式文件上传到后端的方法
写在前面 我发现,微信的wx.uploadFile接口限制好多,而且会经常性出现bug,所以今天搜了一上午的资料, 看看能不能不要通过这个接口上传multipart/form-data格式的文件. 后 ...
- 微信小程序云开发实战:网上商城(二)
微信小程序云开发实战:网上商城(二) 主页面 入口页面 云函数与云数据库 代码实现 云端实现 小程序端实现 选择UI组件库 WeUI Vant 整合UI组件库 以扩展包的方式引入weui 接下来 主页 ...
最新文章
- 燃爆了!天猫联合天一广场搞事情,800万宁波人坐不住了
- Object 标签遮挡 Div 显示
- BZOJ4403 序列统计—Lucas你好
- CSS实现div梯形分割
- halcon求取区域顶点
- 天大18年c语言离线作业,天大18秋C语言程序设计在线作业一辅导资料.docx-资源下载在线文库www.lddoc.cn...
- python做自动化界面_使用Python进行自动化测试如何切换窗口
- 转g代码教程_图深度学习入门教程(九)——图滤波神经网络模型
- 自然语言处理(NLP)与自然语言理解(NLU)的区别
- QQ轻游戏入门到精通OR放弃?
- 设计师的十大金科玉律
- C语言 execve()函数使用方法
- 迅雷下载边下边播设置为本地安装的浏览器
- cityengine笔记
- Java 中获取错误代码_错误代码:99999, 错误信息:无法获取到文件名
- ayit第十周训练g题
- Cadence Allegro解散Group组图文教程及视频演示
- Dynamo常用节点包下载方法
- AltiumDesigner绘制PCB(四)
- 3D segmentation of nasopharyngeal carcinoma from CT images using cascade deep learning