// components/shopLists/index.js
Component({
externalClasses: ['custom-class'],
properties: {
type: {
type: String,
value: 'single', //single表示单选,range表示选择日期区间
},
monthTranslate: { //日历上的红蓝点
type: Object,
value: {}
}
},
data: {
week: ['日', '一', '二', '三', '四', '五', '六'],
dateList: [],
showYear: '', //页面上展示的年
showMonth: '', //页面上展示的月
showDay: '', //页面上展示的日
startSelectYear: '', //开始选中的年
startSelectMonth: '', //开始选中的月
startSelectDay: 0, //开始选中的日
currentYear: '', //当前年
currentMonth: '', //当前月
currentTime: '2021-01', //当前年月日
startTimestamp: '', //开始的时间戳
endTimestamp: '', //结束的时间戳
},
lifetimes: {
ready() {
const now = new Date();
const startTimestamp = Date.parse(new Date(now.getFullYear(), now.getMonth(), now.getDate()));
this.setData({
currentYear: now.getFullYear(),
currentMonth: now.getMonth() + 1,
startTimestamp
})
this.triggerEvent('getCalendarTime', {
startTime: this.uDateFormat(startTimestamp),
endTime: this.uDateFormat(startTimestamp)
})
this.getCurrentData();
this.getDay()
}
},
observers: {
monthTranslate() {
this.data.dateList.some(val => {
Object.keys(this.data.monthTranslate).some(item => {
if (val.label * 1 == item) {
val.status = this.data.monthTranslate[item].toString()
delete this.data.monthTranslate[item];
return
}
})
if (Object.keys(this.data.monthTranslate).length === 0) {
return
}
})
this.setData({
dateList: this.data.dateList
})
}
},
methods: {
getDay() {
const {
showYear,
showMonth,
showDay
} = this.data;
var firstDay = new Date(`${showYear}, ${showMonth}, 1`).getDay(); //获得每月1号是星期几
let days = new Date(showYear, showMonth, 0).getDate(); //获取当月多少天
this.data.dateList = [];
for (let s = 1; s <= firstDay; s++) {
this.data.dateList.push({
label: '',
timestamp: 0
})
}
for (let i = 1; i <= days; i++) {
this.data.dateList.push({
label: i < 10 ? '0' + i : i,
timestamp: Date.parse(new Date(`${showYear}, ${showMonth}, ${i}`))
})
}
this.setData({
dateList: this.data.dateList,
showYear,
showMonth
})
if (this.data.startSelectYear === '') {
this.data.startSelectYear = showYear
this.data.startSelectMonth = showMonth
this.data.startSelectDay = showDay
}
this.triggerEvent("changTime", {
showYear,
showMonth
})
},
getCurrentData() { //获取当前日期,初始化使用
const date = new Date();
this.data.showYear = date.getFullYear();
this.data.showMonth = date.getMonth() + 1;
this.data.showDay = date.getDate();
},
getNextMonth() { //获取下个月
if (this.data.showMonth < 12) {
this.data.showMonth += 1;
} else {
this.data.showMonth = 1;
this.data.showYear += 1;
}
this.getDay();
},
bindPickerChange(e) { //下拉选择年月
const {
value
} = e.detail;
this.data.showYear = value.split('-')[0] * 1;
this.data.showMonth = value.split('-')[1] * 1;
this.getDay();
},
getLastMonth() { //获取上个月
if (this.data.showMonth !== 1) {
this.data.showMonth -= 1;
} else {
this.data.showMonth = 12;
this.data.showYear -= 1;
}
this.getDay();
},
selectDate(e) {
const {
date
} = e.currentTarget.dataset;
if (!date) {
return;
}
const {
showYear,
showMonth,
startSelectYear,
startSelectMonth,
startSelectDay,
endTimestamp
} = this.data;
const currentTimestamp = Date.parse(new Date(showYear, showMonth - 1, date * 1)); //当前选中的时间戳
if (this.data.type === 'single') { //单选日期
this.setData({
startTimestamp: currentTimestamp,
endTimestamp: currentTimestamp
})
this.triggerEvent('getCalendarTime', {
startTime: this.uDateFormat(this.data.startTimestamp),
endTime: this.uDateFormat(this.data.endTimestamp)
})
return
}
const startTimestamp = Date.parse(new Date(startSelectYear, startSelectMonth - 1, startSelectDay * 1)); //已经选择的开始时间的时间戳
if (this.data.startSelectYear === '' || currentTimestamp < startTimestamp || (currentTimestamp > startTimestamp && currentTimestamp < endTimestamp)) {
this.setData({
startTimestamp: currentTimestamp,
endTimestamp: this.data.endTimestamp >= currentTimestamp ? this.data.endTimestamp : currentTimestamp
})
this.data.startSelectYear = showYear;
this.data.startSelectMonth = showMonth;
this.data.startSelectDay = date;
if (currentTimestamp > startTimestamp && currentTimestamp < endTimestamp) { //如果选择了开始和结束日期中间的日期,则初始化日期
this.setData({
endTimestamp: currentTimestamp
})
}
this.triggerEvent('getCalendarTime', {
startTime: this.uDateFormat(this.data.startTimestamp),
endTime: this.uDateFormat(this.data.endTimestamp)
})
return;
}
this.setData({
endTimestamp: currentTimestamp //结束的时间戳
})
this.triggerEvent('getCalendarTime', {
startTime: this.uDateFormat(this.data.startTimestamp),
endTime: this.uDateFormat(this.data.endTimestamp)
})
},
// 时间戳转日期时间格式: yyyy-MM-dd
uDateFormat(timestamp) {
return this.uMoment(timestamp).format('yyyy-MM-dd')
},
uMoment(timestamp) {
const leftPad = (num) => {
if (num < 10) {
return `0${num}`
}
return `${num}`
}
const date = new Date(timestamp)
return {
format(pattern) {
const str = typeof pattern === 'string' ? pattern : 'yyyy-MM-dd'
if (!Number.isNaN(date.getTime())) {
return str
.replace(/yyyy/i, leftPad(date.getFullYear()))
.replace(/MM/, leftPad(date.getMonth() + 1))
.replace(/dd/i, leftPad(date.getDate()))
.replace(/hh/i, leftPad(date.getHours()))
.replace('mm', leftPad(date.getMinutes()))
.replace(/ss/i, leftPad(date.getSeconds()))
}
return ''
}
}
}
}
})
微信小程序日历组件(可多选单选)

微信小程序日历组件是开发微信小程序时常用的一种交互元素,它允许用户在日历视图中选择特定日期或时间段,通常用于预约、日程管理、时间选择等场景。本组件的特点在于其支持单选和多选模式,可以方便地进行日期操作,并且能够通过红蓝点来标记特殊日期,增强用户体验。
1. **组件化开发**
在小程序开发中,组件化是一种重要的编程模式。通过将功能模块拆分为独立的组件,开发者可以提高代码的复用性和维护性。微信小程序日历组件就是这种思想的体现,它可以作为一个独立的单元被引入到项目中,只需简单配置即可使用。
2. **JavaScript(JS)**
JavaScript是实现微信小程序功能的核心语言。在日历组件中,JS负责处理用户的交互事件,如点击日期、选择范围等,同时处理逻辑,如判断是否已选择某个日期、更新数据状态等。JS代码通常包含在组件的`<script>`标签内,通过`Page`或`Component`对象定义页面或组件的行为。
3. **微信小程序API**
微信小程序提供了丰富的API接口,允许开发者访问设备功能、网络通信、数据存储等。在日历组件中,可能需要用到的API包括但不限于:
- `wx.getSystemInfo`: 获取设备信息,确保组件适应不同屏幕尺寸。
- `wx.setStorageSync`: 存储用户选择的日期,以便在页面跳转后仍能保持状态。
- `wx.request`: 如果需要从服务器获取已标记的日期,可以使用此API进行网络请求。
4. **日历标记**
通过在日历视图上显示红蓝点,可以突出显示特定日期,这在很多应用中很有用,比如标记节假日、纪念日或者用户已预定的日子。在小程序中,这通常通过修改组件样式或者数据状态来实现。
5. **用户交互设计**
为了提供良好的用户体验,日历组件需要考虑易用性和视觉效果。例如,单选和多选模式下的交互方式应有所不同,用户应能直观地看到已选日期。此外,组件应具备无障碍特性,确保视觉障碍的用户也能方便使用。
6. **组件配置与属性**
微信小程序中的组件可以通过属性来定制其行为和外观。对于日历组件,可能包含的属性有:
- `mode`: 选择模式,可以是单选(single)或多选(multiple)。
- `selectedDates`: 已选中的日期数组。
- `markedDates`: 标记了特殊状态的日期对象,包含颜色和其他自定义属性。
- `minDate` 和 `maxDate`: 设置可选日期的范围。
7. **事件处理**
为了响应用户的操作,组件需要定义各种事件处理器,如`bindchange`事件,当用户选择日期时触发,将选定的日期回传给父组件,进行后续处理。
8. **样式定制**
使用微信小程序的CSS(WXML)和WXSS,开发者可以调整日历组件的样式,包括颜色、字体、布局等,以符合应用的整体设计风格。
微信小程序日历组件结合了JS编程、组件化开发、微信小程序API、用户交互设计等多个方面的技术,是构建高效、用户友好的小程序不可或缺的一部分。通过熟练掌握这些知识点,开发者能够创建出满足各种需求的日历功能。

------
- 粉丝: 11
最新资源
- 【工业4.0边缘AI】基于TinyML的单片机电机异常检测系统设计:STM32H743XI实时振动监测与代码优化案例分析
- 【单片机开发】基于STM32WL55JC的智慧农业节点全栈实现:从LED到LoRa的关键技术与应用文档的主要内容
- 【单片机开发】进阶实践与复杂系统设计:多模块协同应用及未来发展趋势综述单片机开发
- 【单片机开发】从基础入门到实践应用:关键概念、开发技巧及典型应用场景详解
- 【单片机开发】基于传感器数据采集与处理的温度监测系统设计:51单片机与DS18B20的实际应用案例分析
- 交流微电网系统中光伏、储能与异步电动机的协同控制及其实现方法
- Edge浏览器插件 定时鼠标左键点击
- JAVA+SQL电子通讯录带系统托盘(论文+源代码)
- 基于IGDT信息间隙决策理论的综合能源系统优化调度:应对风光不确定性与碳经济最大化 · 光热电站
- 直流微电网仿真模型:光伏+储能+三相逆变器的设计与实现(附建模过程)
- 直流微电网关键技术解析:光伏升压、双向DCDC储能与三相逆变系统的智能电力解决方案 · 直流微电网
- JAVA3D的网络三维技术的设计与实现(源代码+论文+说明)
- 基于双层优化策略的微电网系统容量配置与运行策略研究:多电源优化调度代码实践
- 基于共享储能电站的工业用户日前优化经济调度方法与效益分析
- MATLAB实现多智能体系统一致性算法用于电力系统分布式经济调度
- 基于多智能体系统一致性算法的电力系统分布式经济调度策略——代码实现与效果评估