微信小程序开发05-日历组件的实现

接上文:微信小程序开发04-打造自己的UI库

github地址:https://github.com/yexiaochai/wxdemo

我们这里继续实现我们的日历组件,这个日历组件稍微有点特殊,算是相对复杂的组件了,然后一般的日历组件又会有很多的变化,所以我们这里实现最基本的标签即可:

 1 let View = require(‘behavior-view‘);
 2 const util = require(‘../utils/util.js‘);
 3
 4 // const dateUtil = util.dateUtil;
 5
 6 Component({
 7   behaviors: [
 8     View
 9   ],
10   properties: {
11
12   },
13   data: {
14     weekDayArr: [‘日‘, ‘一‘, ‘二‘, ‘三‘, ‘四‘, ‘五‘, ‘六‘],
15     displayMonthNum: 1,
16
17     //当前显示的时间
18     displayTime: null,
19     //可以选择的最早时间
20     startTime: null,
21     //最晚时间
22     endTime: null,
23
24     //当前时间,有时候是读取服务器端
25     curTime: new Date()
26
27   },
28
29   attached: function () {
30     //console.log(this)
31   },
32   methods: {
33
34   }
35 })
 1 <wxs module="dateUtil">
 2   var isDate = function(date) {
 3     return date && date.getMonth;
 4   };
 5
 6   var isLeapYear = function(year) {
 7     //传入为时间格式需要处理
 8     if (isDate(year)) year = year.getFullYear()
 9     if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) return true;
10     return false;
11   };
12
13   var getDaysOfMonth = function(date) {
14     var month = date.getMonth(); //注意此处月份要加1,所以我们要减一
15     var year = date.getFullYear();
16     return [31, isLeapYear(year) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month];
17   }
18
19   var getBeginDayOfMouth = function(date) {
20     var month = date.getMonth();
21     var year = date.getFullYear();
22     var d = getDate(year, month, 1);
23     return d.getDay();
24   }
25
26   var getDisplayInfo = function(date) {
27     if (!isDate(date)) {
28       date = getDate(date)
29     }
30     var year = date.getFullYear();
31
32     var month = date.getMonth();
33     var d = getDate(year, month);
34
35     //这个月一共多少天
36     var days = getDaysOfMonth(d);
37
38     //这个月是星期几开始的
39     var beginWeek = getBeginDayOfMouth(d);
40
41     /*
42         console.log(‘info‘,JSON.stringify( {
43           year: year,
44           month: month,
45           days: days,
46           beginWeek: beginWeek
47         }));
48     */
49
50     return {
51       year: year,
52       month: month,
53       days: days,
54       beginWeek: beginWeek
55     }
56   }
57
58   module.exports = {
59     getDipalyInfo: getDisplayInfo
60   }
61 </wxs>
62
63
64 <view class="cm-calendar">
65   <view class="cm-calendar-hd ">
66     <block wx:for="{{weekDayArr}}">
67       <view class="item">{{item}}</view>
68     </block>
69   </view>
70   <view class="cm-calendar-bd ">
71     <view class="cm-month ">
72     </view>
73     <view class="cm-day-list">
74
75       <block wx:for="{{dateUtil.getDipalyInfo(curTime).days + dateUtil.getDipalyInfo(curTime).beginWeek}}" wx:for-index="index">
76
77         <view wx:if="{{index < dateUtil.getDipalyInfo(curTime).beginWeek }}" class="item active"></view>
78         <view wx:else class="item">{{index + 1 - dateUtil.getDipalyInfo(curTime).beginWeek}}</view>
79
80       </block>
81
82       <view class=" active  cm-item--disabled " data-cndate="" data-date="">
83
84       </view>
85     </view>
86   </view>
87 </view>

这个是非常简陋的日历雏形,在代码过程中有以下几点比较痛苦:

① WXML与js间应该只有数据传递,根本不能传递方法,应该是两个webview的通信,而日历组件这里在WXML层由不得不写一点逻辑

② 本来在WXML中写逻辑已经不太对了,而我们引入的WXS,使用与HTML中的js片段也有很大的不同

这些问题,一度让代码变得复杂,而可以看到一个简单的组件,还没有复杂功能,涉及到的文件都太多了,这里是调用层:

<ui-calendar  is-show="" ></ui-calendar>

事实上,我们以上数据根本不应该写到data里面,应该属性传递,我们这里先为了简单实现功能,接下来我们继续完善这个组件,具体代码请看git:

这个日历组件应该是在小程序中写的最复杂的组件了,尤其是很多逻辑判断的代码都放在了WXML里面,根据之前的了解,小程序渲染在一个webview中,js逻辑在一个webview中,他这样做的目的可能是想让性能更好,但是我这里代码写起来事实上是有点痛苦的,我们这里开始组装组件,将数据配置放到属性上,开始组装abstract-page,事实上我认为日历这种非全局组件本来不应该放到基类中:

① 因为Component提供的是一个标签,而且涉及的文件很多,加上继承关系很不好管理

② 因为日历组件事实上是一个标签,所以我们会有一个引入的基础WXML,一个使用的js,完全独立一个文件更加复杂

③ 本来小程序或者复杂的页面都应该组件化开发,所以我们简历一个页面级别的组件,分散到对应的页面中

小程序像是给灵活的HTML&JS戴上了枷锁,只允许在其允许的范围灵活,我们这里尝试对页面进行再拆分:

1 <import src="./mod.searchbox.wxml" />
2 <view>
3   <template is="searchbox" />
4 </view>
5 <include src="./mod/calendar.wxml"/>
6 <include src="../../utils/abstract-page.wxml"/>
<ui-calendar displayTime="{{CalendarDisplayTime}}"
selectedDate="{{CalendarSelectedDate}}"
displayMonthNum="{{CalendarDisplayMonthNum}}"
is-show="{{isCalendarShow}}" ></ui-calendar>
 1 /*
 2 事实上一个mod就只是一个对象,只不过为了方便拆分,将对象分拆成一个个的mod
 3 一个mod对应一个wxml,但是共享外部的css,暂时如此设计
 4 所有日历模块的需求全部再此实现
 5 */
 6 module.exports = {
 7   q: 1,
 8   ddd: function(){},
 9
10   data: {
11     isCalendarShow: ‘‘,
12     CalendarDisplayMonthNum: 2,
13     CalendarDisplayTime: new Date(),
14     CalendarSelectedDate: null
15   }
16 }

核心代码还是在abstract-page里面:

 1   //pageData为页面级别数据,mod为模块数据,要求一定不能重复
 2   initPage(pageData, mod) {
 3     //debugger;
 4     let _pageData = {};
 5     let key, value, k, v;
 6
 7     //为页面动态添加操作组件的方法
 8     Object.assign(_pageData, this.getPageFuncs(), pageData);
 9
10     //生成真实的页面数据
11     _pageData.data = {};
12     Object.assign(_pageData.data, this.getPageData(), pageData.data || {});
13
14     for( key in mod) {
15       value = mod[key];
16       for(k in value) {
17         v = value[k];
18         if(k === ‘data‘) {
19           Object.assign(_pageData.data, v);
20         } else {
21           _pageData[k] = v;
22         }
23       }
24     }
25
26     console.log(_pageData);
27     return _pageData;
28   }

这里再改造一下,我们基本的日历组件便完成了80%了:

 1 /*
 2 事实上一个mod就只是一个对象,只不过为了方便拆分,将对象分拆成一个个的mod
 3 一个mod对应一个wxml,但是共享外部的css,暂时如此设计
 4 所有日历模块的需求全部再此实现
 5 */
 6 module.exports = {
 7   q: 1,
 8   ddd: function(){},
 9   onCalendarDayTap: function (e) {
10     let data = e.detail;
11     var date = new Date(data.year, data.month, data.day);
12     console.log(date)
13     this.setData({
14       calendarSelectedDate: date
15     });
16   },
17   data: {
18     isCalendarShow: ‘‘,
19     calendarDisplayMonthNum: 2,
20     calendarDisplayTime: new Date(),
21     calendarSelectedDate: null
22   }
23 }

至此,我们组件相关课题基本结束,接下来,我们开始我们的业务代码

原文地址:https://www.cnblogs.com/yexiaochai/p/9412951.html

时间: 2024-10-27 16:07:57

微信小程序开发05-日历组件的实现的相关文章

微信小程序开发-地图map组件上使用input组件

微信小程序开发-地图map组件上使用input组件 标签: 微信小程序 uni-app 原生组件层级关系 微信小程序在最高层级 在微信小程序中原生组件包括camera canvas input(仅在focus时表现为原生组件) live-player live-pusher map textarea video 在微信小程序开发中原生组件的层级是最高的,所以页面中的其他组件无论设置 z-index 为多少,都无法盖在原生组件上. 后插入的原生组件可以覆盖之前的原生组件. 原生组件还无法在 pic

微信小程序开发—快速掌握组件及API的方法---转载

微信小程序框架为开发者提供了一系列的组件和API接口. 组件主要完成小程序的视图部分,例如文字.图片显示.API主要完成逻辑功能,例如网络请求.数据存储.音视频播放控制,以及微信开放的微信登录.微信支付等功能. 组件 官方文档:https://mp.weixin.qq.com/debug/wxadoc/dev/component/ 对于开发文档,个人建议先了解其整体框架,了解其提供了哪些组件,再联想到这些组件会用在哪些产品的哪些功能.对于接口也是一样,整体了解,而不需要细看. 熟悉了文档的结构,

手摸手教你微信小程序开发之自定义组件

前言 相信大家在开发小程序时会遇到某个功能多次使用的情况,比如弹出框.这个时候大家首先想到的是组件化开发,就是把弹出框封装成一个组件,然后哪里使用哪里就调用,对,看来大家都是有思路的人,但是要怎样实现呢.可能你会去看官方文档,但是微信的官方文档也是说的不太清楚,所以写起来也是非常痛苦.今天就带大家手摸手开发微信组件,坐稳了,马路杀手要开车了. 具体实现 我们先实现个简单的弹窗组件,详情图如下: 1.新建component文件夹存放我们的组件,里边存放的就是我们所用的组件,我们今天要做的事弹出框,

【微信小程序开发】 wxParse组件

简单介绍: wxParse是一个templet组件,Html代码转化成小程序的标签,目的是解决需要兼容手机端.小程序端的HTML内容. 文件有: html2json.js //将html每个标签转化成DOM对象的node htmlparse.js //由html2json.js引用 showdown.js //由wxParse.js引用 wxDiscode.js //支持的符号库 wxParse.js //主入口的js,和处理各种标签的事件,如图片的onload wxParse.wxml //不

腾讯工程师教你9小时搞定微信小程序开发

下载地址:百度网盘下载 课程介绍本课程从最基础的微信小程序开发工具使用开始讲起,带你走完从写出第一个 HelloWorld 到构建出第一款属于自己的微信小程序的完整学习路线.课程共有八大模块:模块一:微信小程序介绍与开发准备模块二:上手第一个微信小程序模块三:微信小程序开发框架模块四:微信小程序开发之原生组件模块五:微信小程序开发之原生 API模块六:微信小程序开发进阶之核心技能模块七:微信小程序开发项目实战案例模块八:微信小程序开发实战注意事项与进阶指导 课程详细大纲 原文地址:https:/

微信小程序开发心得

微信小程序也已出来有一段时间了,最近写了几款微信小程序项目,今天来说说感受. 首先开发一款微信小程序,最主要的就是针对于公司来运营的,因为,在申请appid(微信小程序ID号)时候,需要填写相关的公司认证信息如,营业执照等 再次就是用一个未曾开通过公众号的QQ号或微信号来注册一个微信小程序号. 最后,下载微信小程序开发工具. 由于这里,我们更多的关注如何去开发一些app,而不是科谱微信小程序,故在此不在过多的解释,详细的说明,可以去官网帮助文档. 首先,我们拿自己的项目在一步一步的说明并开发吧,

微信小程序开发入门教程

做任何程序开发要首先找到其官方文档,微信小程序目前还在邀请内测阶段,目前官方放出了部分开发文档,经过笔者一天的查看和尝试,感觉文档并不全面,但是通过这些文档已经能够看出其大概面貌了.闲话不多说,我们先来看看其有哪些官方文档. 微信公众平台开发者文档统一入口为:https://mp.weixin.qq.com/wiki,这里面大部分内容都是以前就有的,微信开发都是基于此份文档. 现在的变化是在这份文档的顶部加了一个“微信公众平台.小程序”的入口,这个入口才就是专门针对微信小程序开发的文档,如下图:

微信小程序开发日记——高仿知乎日报(上)

本人对知乎日报是情有独钟,看我的博客和github就知道了,写了几个不同技术类型的知乎日报APP 要做微信小程序首先要对html,css,js有一定的基础,还有对微信小程序的API也要非常熟悉 我将该教程分为以下三篇 微信小程序开发日记--高仿知乎日报(上) 微信小程序开发日记--高仿知乎日报(中) 微信小程序开发日记--高仿知乎日报(下) 三篇分别讲不同的组件和功能块 这篇要讲 API分析 启动页 轮播图 日报列表 浮动按钮 侧滑菜单 API分析 以下是使用到的具体API,更加详细参数和返回结

微信小程序_微信小程序开发,小程序源码、案例、教程

原文地址:http://whosmall.com/?post=448 本文标签: 微信小程序 小程序源码案例 小程序项目 小程序源码 微信小程序教程 什么是微信小程序? 微信小程序是微信基于微信平台的一个应用发布平台,微信小程序app开发属于原生app组件提供js接口的开发方式,比混合是app的用户体验更好,仅次于原生应用. 不过微信小程序定位于小,要符合轻量易用无需下载,所以从体积上也是有限制,整个小程序应用体积不能超过1M. 微信小程序的应用场景? 微信小程序的应用场景适用于轻量应用,非强交