微信小程序可滑动周日历组件使用详解


Posted in Javascript onOctober 21, 2019

微信小程序可滑动周日历组件,供大家参考,具体内容如下

看网上周日历组件比较少,自己弄了一个,和大家分享一下。

如果样式变形,请检查是否有共用样式起冲突

展示一下效果图

微信小程序可滑动周日历组件使用详解

在components组件文件夹下新建calendarWeek文件夹

直接上代码吧:

index.wxml

<!--components/calendarWeek/index.wxml-->
<!-- 日历 -->
<view class="date-choose shrink border-bottom10">

 <picker mode="date" bindchange="tiaotime"><view class="data-month">{{dateYear}}{{dateMonth}}</view></picker>
 <swiper class="date-choose-swiper" circular="true" indicator-dots="{{false}}" current="{{swiperCurrent}}" bindchange="dateSwiperChange">
 <block wx:for="{{dateList}}" wx:for-item="date" wx:key="date.id">
 <swiper-item class="swiper-item">
 <view class="weekday">
 <block wx:for-item="weekday" wx:for="{{dateListArray}}" wx:key="{{index}}">
 <text class="week">{{weekday}}</text>
 </block>
 </view>
 <view class="dateday">
 <block wx:for="{{date.days}}" wx:for-item="day" wx:key="{{day.id}}">
 <!-- <view>{{day.ids}}</view> -->
 <view class="day" id="{{day.id}}" bindtap="chooseDate" >
 <text class="{{dateCurrentStr==day.id?'active':''}}{{today==day.id?' reds':''}}" >{{day.day}}</text>
 </view>
 </block>
 </view>
 </swiper-item>
 </block>
 </swiper>
</view>
<!-- 日历 -->

index.wxss

/* components/calendarWeek/index.wxss */

.date-choose {
 background: #fff;
 overflow: hidden;
 height: auto;
}
.data-month {
 width: 100%;
 align-items: center;
 padding: .35rem .35rem;
 text-align: left;
 color: #333;
 font-size: 38rpx;
}
.date-choose-swiper {
 flex-grow: 1;
 height: 182rpx;
}
.swiper-item {
 display: flex;
 flex-direction: column;
}
.weekday, .dateday {
 display: flex;
 justify-content: space-between;
 align-items: center;
 text-align: center;
 flex-wrap: wrap;
 flex-grow: 1;
}
.week, .day {
 width: 14.286%;
 flex-basis: 14.286%;
}
.week{
 color: #999;
 font-size: 24rpx;
}
.day text {
 position: relative;
 color: #333333;
}
.day .active:before {/* 圈圈 */
 content: "";
 position: absolute;
 width: 76rpx;
 height: 76rpx;
 top: 50%;
 left: 50%;
 -webkit-transform: translate(-50%, -50%);
 transform: translate(-50%, -50%);
 border: 1px solid red;
 border-radius: 100%;
 background: red;
 opacity: 0.1;
 z-index: -1;
}
.day text.active {
 color: red
}
.day text.reds {
 color: #ff0000;
}
/*开始*/

.headerone {
 width: 100%;
 height: auto;
 font-size: 24rpx;
 /* margin: 0 30rpx; */
}
.headerone .ra {
 margin-right: 20rpx;

}
.headerone .radio-group{
 margin: 20rpx 0 20rpx 30rpx;
}
.headertwo {
 width: 100%;
 height: auto;
 font-size: 24rpx;
 margin-top: 10rpx;
 margin-bottom: 26rpx;
}
.headertwo .le image {
 width: 70rpx;
 height: 70rpx;
 border-radius: 10px;
 margin-left: 30rpx;
 margin-right: 20rpx
}
.headertwo .ri {
 flex: 1;
 margin-right: 30rpx;
 border-radius: 6px;
 box-shadow:0px 1px 6px 0px rgba(198,198,198,0.5);
}
.headertwo .ri .one{
 width: 100%;
 padding-top: 24rpx;
 padding-bottom :24rpx
}
.headertwo .ri .one view .jiao {
 margin: 0 16rpx;
 border:15rpx solid;
 /* margin-top: 15rpx; */
 border-color: #ffffff #ffffff #b3b3b3 #ffffff;
}
.xi {
 background: red;
 color: #ffffff;
 padding:3px 10px;
 border-radius: 6px 0px 0 6px;

}
.headertwo .ri .one view view.jiaos {
 margin: 0 16rpx;
 border:15rpx solid;
 margin-top: 14rpx;
 border-color:#b3b3b3 #ffffff #ffffff #ffffff;
}
.headertwo .ri .two{
 width: 100%;
 overflow: hidden;
 transition: all 0.5s
}
.headertwo .ri .two .body{
 width: 100%;
 /* padding-left: 60rpx; */
 /* padding-right: 22rpx; */
 padding-top: 24rpx;
 padding-bottom :24rpx;

}

index.js

// components/calendarWeek/index.js
var utils = require('./util.js')
Component({
 /**
 * 组件的属性列表
 */
 properties: {

 },

 /**
 * 组件的初始数据
 */
 data: {
 valtime: 8,
 dateList: [], // 日历数据数组
 swiperCurrent: 0, // 日历轮播正处在哪个索引位置
 dateCurrent: new Date(), // 正选择的当前日期
 dateCurrentStr: '', // 正选择日期的 id
 dateMonth: '1月', // 正显示的月份
 dateListArray: ['日', '一', '二', '三', '四', '五', '六'],
 },
 ready: function () {
 var that = this;
 var today = utils.formatTime2(new Date());
 this.setData({
 today,
 });
 var d = new Date();
 this.initDate(-5, 2, d); // 日历组件程序 -4左表示过去4周 右1表示过去一周

 },
 /**
 * 组件的方法列表
 */
 methods: {
 tiaotime(e) {
 let data = e.detail.value.split("-")
 var d = new Date(Number(data[0]), Number(data[1]) - 1, Number(data[2]));
 this.setData({
 dateList: []
 })
 this.initDate(-5, 2, d); // 日历组件程序 -4左表示过去4周 右1表示过去一周
 },
 onShow: function (e) {
 wx.getSystemInfo({
 success: (res) => {
 this.setData({
 windowHeight: res.windowHeight,
 windowWidth: res.windowWidth,
 });
 }
 });
 },

 // 日历组件部分
 // ----------------------------
 initDate(left, right, d) {
 var month = utils.addZero(d.getMonth() + 1),
 year = utils.addZero(d.getFullYear()),
 day = utils.addZero(d.getDate());
 for (var i = left; i <= right; i++) {
 this.updateDate(utils.DateAddDay(d, i * 7));//多少天之后的
 }
 
 this.setData({
 swiperCurrent: 5,
 dateCurrent: d,
 dateCurrentStr: d.getFullYear() + '-' + month + '-' + day,
 dateMonth: month + '月',
 dateYear: year + '年',
 dateCurrentStr: year + "-" + month + "-" + day,
 });
 },
 // 获取这周从周日到周六的日期
 calculateDate(_date) {
 var first = utils.FirstDayInThisWeek(_date);
 var d = {
 'month': first.getMonth() + 1,
 'days': [],

 };
 for (var i = 0; i < 7; i++) {
 var dd = utils.DateAddDay(first, i);
 var day = utils.addZero(dd.getDate()),
 year = utils.addZero(dd.getFullYear()),
 month = utils.addZero(dd.getMonth() + 1);

 d.days.push({
 'day': day,
 'id': dd.getFullYear() + '-' + month + '-' + day,
 'ids': dd.getFullYear() + ',' + month + ',' + day,
 });
 }
 return d;
 },
 // 更新日期数组数据
 updateDate(_date, atBefore) {
 var week = this.calculateDate(_date);
 if (atBefore) {
 this.setData({
 dateList: [week].concat(this.data.dateList),
 });
 } else {
 this.setData({
 dateList: this.data.dateList.concat(week),
 });
 }

 },
 // 日历组件轮播切换
 dateSwiperChange(e) {
 const lastIndex = this.data.swiperCurrent
 , currentIndex = e.detail.current
 , dateList = this.data.dateList
 , dateListlen = this.data.dateList.length
 let flag = false
 , key = 'lastMonth' //判断是左划还是右
 // console.log(lastIndex , currentIndex)
 if (lastIndex > currentIndex) {
 lastIndex === 7 && currentIndex === 0
 ? flag = true
 : null

 } else {
 lastIndex === 0 && currentIndex === 7
 ? null
 : flag = true
 }
 if (flag) {
 key = 'nextMonth'
 }
 if (key == 'lastMonth') {
 let nowindex = currentIndex - 3;
 let uptime = currentIndex - 4;
 let a = 0;
 if (nowindex < 0) { nowindex = nowindex + 8; a = 0 }
 if (uptime < 0) { uptime = uptime + 8 }

 let seltime = dateList[nowindex].days[a].ids
 var week = this.calculateDate(utils.formatTime(utils.DateAddDay(seltime, -1)));

 dateList[uptime] = week
 this.setData({
 dateList: dateList
 })

 }
 if (key == 'nextMonth') {
 let indexne = 0
 let aa = 0
 if (currentIndex == 7) { //要更新的下标
 indexne = 0
 aa = 1
 } else {
 indexne = currentIndex + 1
 aa = currentIndex + 2
 }
 if (aa == 8) {
 aa = 0
 }
 //aa 要更新的数组下标 datanex要往后查询一周的日期
 let datanex = dateList[indexne].days[6].ids
 //获取下一周的
 var week = this.calculateDate(utils.formatTime(utils.DateAddDay(datanex, 1)));
 dateList[aa] = week
 
 this.setData({
 dateList: dateList
 })
 }

 var d = this.data.dateList[currentIndex];
 let da = new Date(d.days[0].ids)
 this.setData({
 swiperCurrent: currentIndex,
 dateMonth: d.month + '月',
 dateYear: da.getFullYear()+"年"
 })

 },
 // 获得日期字符串
 getDateStr: function (arg) {
 if (utils.type(arg) == 'array') {
 return arr[0] + '-' + arr[1] + '-' + arr[2] + ' 00:00:00';
 } else if (utils.type(arg) == 'date') {
 return arg.getFullYear() + '-' + (arg.getMonth() + 1) + '-' + arg.getDate() + ' 00:00:00';
 } else if (utils.type(arg) == 'object') {
 return arg.year + '-' + arg.month + '-' + arg.day + ' 00:00:00';
 }
 },

 // 点击日历某日
 chooseDate(e) {
 var str = e.currentTarget.id;
 // console.log(str);
 this.setData({ dateCurrentStr: str });
 this.triggerEvent('mydata', { data: str })
 },
 }
})

要引入util.js

// 时间格式转换 yyyy/mm/dd
function formatTime(date) {
 var year = date.getFullYear()
 var month = date.getMonth() + 1
 var day = date.getDate()

 var hour = date.getHours()
 var minute = date.getMinutes()
 var second = date.getSeconds()


 return [year, month, day].map(formatNumber).join('/') + ' ' + [hour, minute, second].map(formatNumber).join(':')
}
// 时间格式转换 yyyy-mm-dd
function formatTime2(date) {
 var year = date.getFullYear()
 var month = date.getMonth() + 1
 var day = date.getDate()

 var hour = date.getHours()
 var minute = date.getMinutes()
 var second = date.getSeconds()


 return [year, month, day].map(formatNumber).join('-') 
}

function formatDate(date, split) {
 var year = date.getFullYear()
 var month = date.getMonth() + 1
 var day = date.getDate()
 return [year, month, day].map(formatNumber).join(split || '')
}

// 两位数自动补零
function formatNumber(n) {
 n = n.toString()
 return n[1] ? n : '0' + n
}

// 两位数以内的数字自动补零
function formatNumber(n) {
 n = n.toString()
 return n[1] ? n : '0' + n
}


// 计算变化多少天后的日期
function DateAddDay(d, days) {
 
 var d = new Date(d);
 return new Date(d.setDate(d.getDate() + days));
}
// 获得本周周日的日期
function FirstDayInThisWeek(d) {
 
 var d = new Date(d);
 // console.log(formatTime(DateAddDay(d, 0 - d.getDay())));
 return DateAddDay(d, 0 - d.getDay());
}

// 判断类型
function Type(obj) {
 var typeStr = Object.prototype.toString.call(obj).split(" ")[1];
 return typeStr.substr(0, typeStr.length - 1).toLowerCase();
}

module.exports = {
 formatTime: formatTime,
 formatDate: formatDate,
 formatTime2,
 DateAddDay: DateAddDay,
 FirstDayInThisWeek: FirstDayInThisWeek,
 type: Type,
 addZero: formatNumber,
}

调用组件

//json文件调用
"usingComponents": {
 "calendarMonth": "../../components/calendarWeek/index"
}

页面调用组件

//mydata触发的点击日期时触发的事件 可获取当前点击的日期
 <calendarMonth bindmydata="mydata"></calendarMonth>

当前页面js

//js里的事件
 mydata(e){ //可获取日历点击事件
 let data = e.detail.data
 console.log(data)
}

更多精彩的日历效果请学习参考专题:javascript日历插件

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery提示 &quot;object expected&quot;的解决方法
Dec 13 Javascript
JS数组的常见用法实例
Feb 10 Javascript
jquery图片切换插件
Mar 16 Javascript
JavaScript自定义等待wait函数实例分析
Mar 23 Javascript
js实现网页多级级联菜单代码
Aug 20 Javascript
jQuery UI设置固定日期选择特效代码分享
Aug 27 Javascript
基于jQuery Tipso插件实现消息提示框特效
Mar 16 Javascript
详解Vue中状态管理Vuex
May 11 Javascript
原生js实现密码输入框值的显示隐藏
Jul 17 Javascript
Chrome调试折腾记之JS断点调试技巧
Sep 11 Javascript
Angular 开发学习之Angular CLI的安装使用
Dec 31 Javascript
微信小程序日历弹窗选择器代码实例
May 09 Javascript
小程序实现横向滑动日历效果
Oct 21 #Javascript
微信小程序实现点击图片放大预览
Oct 21 #Javascript
vue实现Input输入框模糊查询方法
Jan 29 #Javascript
mpvue实现左侧导航与右侧内容的联动
Oct 21 #Javascript
vue项目中常见问题及解决方案(推荐)
Oct 21 #Javascript
vue.js实现左边导航切换右边内容
Oct 21 #Javascript
vue+element树组件 实现树懒加载的过程详解
Oct 21 #Javascript
You might like
ftp类(example.php)
2006/10/09 PHP
图象函数中的中文显示
2006/10/09 PHP
PHP gbk环境下json_dencode传送来的汉字
2012/11/13 PHP
Laravel 5.0 发布 新版本特性详解
2015/02/10 PHP
索趣科技的答案
2007/02/07 Javascript
jquery中的sortable排序之后的保存状态的解决方法
2010/01/28 Javascript
jQuery封装的屏幕居中提示信息代码
2016/06/08 Javascript
有关文件上传 非ajax提交 得到后台数据问题
2016/10/12 Javascript
利用types增强vscode中js代码提示功能详解
2017/07/07 Javascript
Angular表格神器ui-grid应用详解
2017/09/29 Javascript
4个顶级开源JavaScript图表库
2018/09/29 Javascript
在 Angular-cli 中使用 simple-mock 实现前端开发 API Mock 接口数据模拟功能的方法
2018/11/28 Javascript
微信小程序与后台PHP交互的方法实例分析
2018/12/10 Javascript
Vue.js的模板语法详解
2020/02/16 Javascript
js 获取扫码枪输入数据的方法
2020/06/10 Javascript
解决vue请求接口第一次成功,第二次失败问题
2020/09/08 Javascript
Python简单日志处理类分享
2015/02/14 Python
Python解析excel文件存入sqlite数据库的方法
2016/11/15 Python
scrapy爬虫完整实例
2018/01/25 Python
python检测空间储存剩余大小和指定文件夹内存占用的实例
2018/06/11 Python
Django错误:TypeError at / 'bool' object is not callable解决
2019/08/16 Python
在pytorch中查看可训练参数的例子
2019/08/18 Python
Python文件路径名的操作方法
2019/10/30 Python
python DES加密与解密及hex输出和bs64格式输出的实现代码
2020/04/13 Python
Python Pivot table透视表使用方法解析
2020/09/11 Python
Django restful framework生成API文档过程详解
2020/11/12 Python
python 使用tkinter+you-get实现视频下载器
2020/11/17 Python
美国知名的摄影器材销售网站:Adorama
2017/02/01 全球购物
Nip + Fab官网:英国美容品牌
2019/08/26 全球购物
加拿大服装和鞋类零售商:Mark’s
2021/01/04 全球购物
颇特女士香港官网:NET-A-PORTER香港
2021/03/08 全球购物
如何用Lucene索引数据库
2016/02/23 面试题
介绍一下Make? 为什么使用make
2016/07/31 面试题
大学毕业感言一句话
2014/02/06 职场文书
中学生期中自我鉴定
2014/04/20 职场文书
学长教您写论文:经验总结
2019/07/09 职场文书