小程序组件实现周日历功能,课程表、食谱等功能可能会用到的日历简单实现
周日历功能,课程表、食谱等功能可能会用到的日历简单实现,刚学小程序一个月,有不好的地方还请大家提出
一、功能演示
第一次写博客,但一定写的完整,方便参考,直接上效果,点击切换上下周,点击日期将日期返回到调用组件的页面。默认显示当前日期。这样就可以在调用页面根据日期更改下面要显示的内容了。可以自己进行选中日期的样式改变。
二、代码及说明
先简单说一下思路流程,这样的界面肯定要维护一个日期列表对象,可以获取一周的日期并且可以切换上下周,首先这时候就需要一个对时间进行操作的工具类,并且可以直接返回我们想要的列表,下面是工具类的代码,每个方法都有详细注释
//获取当前周和日期对应列表
function getWeekDayList(selectWeek){
// 1.获取周一对应得时间
// 2.用循环七次添加周一到周日对应得周几和几号
var selectWeekTime = getCurrentTimeStamp() + (selectWeek * 7) * 24 * 60 * 60 * 1000
var mondayTime = selectWeekTime - (getWeekNumber(selectWeekTime)-1) * 24 * 60 * 60 * 1000
//创建我们想要的时间列表
var timeBean = {
yearMonth: '', //年月
weekDayList: [] //周和日的列表
}
for(var i=0;i<7;i++){
var weekDay={
week:'',
day:''
}
weekDay.week = getWeek(mondayTime + i * 24 * 60 * 60 * 1000)
weekDay.day = getMyDay(mondayTime + i * 24 * 60 * 60 * 1000)
timeBean.weekDayList.push(weekDay)
}
timeBean.yearMonth = getYearMonth(selectWeekTime);
return timeBean;
}
//获取当前时间戳
function getCurrentTimeStamp() {
var timestamp = new Date().getTime();
return timestamp
}
//获取当前周几 0123456
function getCurrenrWeek() {
var str = "7123456".charAt(new Date().getDay());
return str;
}
//时间戳获得年月
function getYearMonth(res) {
var time = new Date(res);
var y = time.getFullYear();
var m = time.getMonth() + 1;
return y+"-"+m;
}
//时间戳转几号
function getMyDay(res) {
var time = new Date(res);
var d = time.getDate();
return d;
}
//时间戳转周几
function getWeek(res){
var time = new Date(res);
var y = time.getFullYear();
var m = time.getMonth() + 1;
var d = time.getDate();
return "日一二三四五六".charAt(new Date(y + '-' + m + '-' + d).getDay());
}
//时间戳转周几 0123456
function getWeekNumber(res) {
var time = new Date(res);
var y = time.getFullYear();
var m = time.getMonth() + 1;
var d = time.getDate();
return "0123456".charAt(new Date(y + '-' + m + '-' + d).getDay());
}
module.exports = { //向外提供需要调用的方法
getWeekDayList: getWeekDayList,
}
我们有了这个工具类也就解决了数据方面的问题,剩下的只是界面和组件的事情就非常简单了,如果还不了解小程序组件的同学自己去百度一下。以下是组件 js json wxml wxss的代码,可以直接复制使用,代码也很简单
js: weekCalendar.js
// compoents/weekCalendar/weekCalendar.js
var util = require("../../utils/time-utils.js")
Component({
options: {
multipleSlots: true // 在组件定义时的选项中启用多slot支持
},
/** * 组件的属性列表 * 用于组件自定义设置 */
properties: {
// 弹窗标题
timeBean: { // 属性名
type: Object, // 类型(必填),目前接受的类型包括:String, Number, Boolean, Object, Array, null(表示任意类型)
value: ''// 属性初始值(可选),如果未指定则会根据类型选择一个
},
selectWeek:{
type: Number,
}
},
/**
* 组件的方法列表
* 更新属性和数据的方法与更新页面数据的方法类似
*/
methods: {
lastWeek:function(e){ //点击了上一周
this.setData({
selectWeek: --this.data.selectWeek,
timeBean: util.getWeekDayList(this.data.selectWeek--) // -- 是获取上一周的日期列表
})
},
nextWeek:function(e){
this.setData({
selectWeek: ++this.data.selectWeek,
timeBean: util.getWeekDayList(this.data.selectWeek++) // ++ 是获取下一周的日期列表,看工具类调用
})
},
itemClick: function (e) {
var index = e.currentTarget.dataset.index
this.triggerEvent("dayClick", index);
},
}
})
json:
{
"component": true //开启组件属性
}
wxml:
<!--compoents/weekCalendar/weekCalendar.wxml-->
<view class='row'>
<view class='row' bindtap='lastWeek'>
<text class='iconfont icon-arrow_left' style='padding:20rpx;'></text>
<view style='font-size:32rpx;'>上一周</view>
</view>
<view class='timeType'>{{timeBean.yearMonth}}</view>
<view class='row' bindtap='nextWeek'>
<view style='font-size:32rpx;'>下一周</view>
<text class='iconfont icon-arrow_right' style='padding:20rpx;'></text>
</view>
</view>
<view class='row'>
<view class='column' wx:for="0123456" bindtap='itemClick' data-index="{{index}}">
<view class='weekType'>{{timeBean.weekDayList[index].week}}</view>
<view class='dateType'>{{timeBean.weekDayList[index].day}}</view>
</view>
</view>
<view class='line'></view>
wxss:这里用到了字体图标,可以直接复制使用
/* compoents/weekCalendar/weekCalendar.wxss */
.row { display:flex; flex-direction:row; justify-content: space-around; align-items: center;}
.column{
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding-bottom: 20rpx;
padding-top: 20rpx;
margin-top: 5rpx;
width: 100%;
}
.timeType{
font-size: 35rpx;
}
.dateType{
font-size: 35rpx;
}
.weekType{
font-size: 28rpx;
color: darkgrey;
}
.line{
height: 1rpx;
width: 100%;
background-color: gainsboro;
}
@font-face {font-family: "iconfont";
src: url('iconfont.eot?t=1532501003320'); /* IE9*/
src: url('iconfont.eot?t=1532501003320#iefix') format('embedded-opentype'), /* IE6-IE8 */
url('data:application/x-font-woff;charset=utf-8;base64,d09GRgABAAAAAAVwAAsAAAAAB+AAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABHU1VCAAABCAAAADMAAABCsP6z7U9TLzIAAAE8AAAARAAAAFZW7khKY21hcAAAAYAAAABnAAABnM8qauxnbHlmAAAB6AAAAYMAAAGcuJvmK2hlYWQAAANsAAAALwAAADYSG74MaGhlYQAAA5wAAAAcAAAAJAfeA4VobXR4AAADuAAAABAAAAAQD+kAAGxvY2EAAAPIAAAACgAAAAoBRACmbWF4cAAAA9QAAAAfAAAAIAETAF1uYW1lAAAD9AAAAUUAAAJtPlT+fXBvc3QAAAU8AAAANAAAAEUwSZYyeJxjYGRgYOBikGPQYWB0cfMJYeBgYGGAAJAMY05meiJQDMoDyrGAaQ4gZoOIAgCKIwNPAHicY2Bk/sU4gYGVgYOpk+kMAwNDP4RmfM1gxMjBwMDEwMrMgBUEpLmmMDgwVDyLY27438AQw9zA0AAUZgTJAQAq/AzMeJzFkMENwCAIRT9iG9P07BQ9Nh3HQ08dwYlZwwJ6cQK/eQI/RAwANgCsXEoE6APB9KpL7jMO9yMerZOeoLFKltLalJnIO5JnwV6mHctE60bPOv2+R2X7rgP9ouSO7VVKB/wDMGoRQwB4nB2QPW/TUBSG73tv/BXbN6nt+CZO7HxhX1AgUtzEGaq2DCAB6lCp6oDo0rkqa5cOWSp16MDCH0Ag+BGV6A9gBImhC4LfwNZbbjg6OsM50nP0vMQg5P4Xu2ZtEpKHZEaekX1CYE4w4jTFUM6ndILW0GiJiDM5lkNrPJqybYiRGcVlNS+EaZkNcGTYHJaVnFKJxXyHbqGMU6DTTQ6CvBewd6i3ZXahXtEPaPXHvcbOE/Xy8W5UDkL7zAuCThBc2aZh2JTWGhynInYMp26qj0YjaV33H9E+vI5M9l77g25wfDl/m+bCAVYrhN0B/7y7kWzoPk/iMOhYTd9uJ/74QYSzP2479NLiN9FF/49b+pfERGjLalEVEgVHrFFrnSWW1XJGv8MyXPWFF13ttVDfeC/nOGSM4QTUz1w895HmXN2qnzxPfbyo1Yw1GjrLO/qDUZ2lpi9RlXFkOYgjc6T/yAqblOGNlwlX3eCpKzJPfXIBvGfrteh76kZ9XZ9x5Dbdf++1QjcAeJxjYGRgYABiTp07E+P5bb4ycLMwgMD1OltuBP3/IQsDswSQy8HABBIFAPtvCJYAeJxjYGRgYG7438AQw8IAAkCSkQEVsAAARwoCbQQAAAAD6QAABAAAAAQAAAAAAAAAAHYApgDOAAB4nGNgZGBgYGEIZGBlAAEmIOYCQgaG/2A+AwAREgFxAHicZY9NTsMwEIVf+gekEqqoYIfkBWIBKP0Rq25YVGr3XXTfpk6bKokjx63UA3AejsAJOALcgDvwSCebNpbH37x5Y08A3OAHHo7fLfeRPVwyO3INF7gXrlN/EG6QX4SbaONVuEX9TdjHM6bCbXRheYPXuGL2hHdhDx18CNdwjU/hOvUv4Qb5W7iJO/wKt9Dx6sI+5l5XuI1HL/bHVi+cXqnlQcWhySKTOb+CmV7vkoWt0uqca1vEJlODoF9JU51pW91T7NdD5yIVWZOqCas6SYzKrdnq0AUb5/JRrxeJHoQm5Vhj/rbGAo5xBYUlDowxQhhkiMro6DtVZvSvsUPCXntWPc3ndFsU1P9zhQEC9M9cU7qy0nk6T4E9XxtSdXQrbsuelDSRXs1JErJCXta2VELqATZlV44RelzRiT8oZ0j/AAlabsgAAAB4nGNgYoAALgbsgIWRiZGZkYWRlYGxgisrMzGvJL+0Mr+UK7GoKL88Pic1rYSBAQCCcwk8') format('woff'),
url('iconfont.ttf?t=1532501003320') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/
url('iconfont.svg?t=1532501003320#iconfont') format('svg'); /* iOS 4.1- */
}
.iconfont {
font-family:"iconfont" !important;
font-size:16px;
font-style:normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.icon-arrow_right:before { content: "\e616"; }
.icon-arrow_left:before { content: "\e65e"; }
下面是页面调用的代码 调用非常简单,没什么需要详细说明的
js:
// pages/recipeList/recipeList.js
var util = require("../../utils/time-utils.js")
var that = this
Page({
/**
* 页面的初始数据
*/
data: {
selectWeek:0, //记录是哪一周 ,0:本周 -1上一周 1下一周
timeBean:{
yearMonth: '',
weekDayList: [{
week: '',
day: ''
}]
},
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
this.setData({ //界面加载时获得本周
timeBean: util.getWeekDayList(this.data.selectWeek)
})
},
dayClick:function(index){
console.log("点击的号为", this.data.timeBean.weekDayList[index.detail].day)
},
)}
json:
{
"navigationBarTitleText": "园所食谱",
"usingComponents": {
"weekCalendar": "../../compoents/weekCalendar/weekCalendar"
}
}
wxml:
<weekCalendar id='weekCalendar' timeBean="{{timeBean}}" bind:dayClick='dayClick'></weekCalendar>
到此结束