小程序日历组件
日历组件,表单组件绝逼是前端开发的一个噩梦,尤其要做好一个旅游项目的日历,变态需求特别多,要在小程序中实现携程app的日历,还要兼顾性能问题。
- 自定义横向/纵向日历
- 自定义区间大小
- 自定义日期内容
- 指定节假日
- 支持跨月显示
难点
- 懒加载保证渲染性能
- 通过配置实现纵向日历和横向日历
- 阳历节日与农历节日与节气
- 交互,尤其是区域选择的交互
示例代码
https://github.com/webkixi/aotoo-xquery => pages/calendar
配置说明
wxml
<ui-calendar dataSource="{{config}}" />
js
基本用法
const Pager = require('../../components/aotoo/core/index') Pager({ data: { config: { $$id: 'calendar', mode: 1, // 纵向日历 type: 'range', // 区域选择 tap: 'onTap', // page响应事件 total: 365, // 定义从今天开始一年事件 rangeCount: 28, // 区选区间28天 festival: true, // 开启节假日显示 value: ['2019-12-24', '2020-01-05'], // 默认值 methods: { // 响应 tap事件 onTap(e, param, inst) { if (param.range === 'start') { inst.update({dot: [{title: '入住'}]}) } if (param.range === 'end') { inst.update({dot: [{title: '离店'}]}) setTimeout(() => { Pager.alert('离店,跳回页面') }, 1000); } console.log(param); } } } } })
$$id
{String} 配置实例的Id
mode
{Number} 设置日历的展示模式,1=纵向日历 2=横向日历
type
{Number} single=单选日历, range=选择区间, multiple=多选日历
total
{Number} 设置日历从今天开始起需要跨多少天,如 180天,或者365天
start
{String} 设置起始日期,如:'2020-06-05'
date
{Object|Function} 定义附加日期内容
disable
{Boolean} 设置全局无效,所有日期均不能交互,权重低于单个日期设置的disable
rangeCount
{Number} 当type === 'range'时,rangeCount为区间大小,意味着区间允许选择多少天
rangeMode
{Number} 当正在做日期区间选择时,是否允许显示angeCount之外的日期 1=显示, 2=不显示
tap
{String} 响应日期元素的tap事件
value
{Array} 默认选中的日期,允许数组为空,如果type='single'则应该设置如['2020-06-05'],type='range'应该设置如['2020-06-03', '2020-06-05'], type='multiple'时,数组允许多值
data
{Array} 该数据会自动计算日期跨度数量(允许跨年设置),如果设置了该数据,则total无效,如设置为['2019-11-05', '2021-11-05'],自动计算日期为730天
festival
{Boolean|Array} 设置日历假期显示,支持显示指定假期
toolbox
{Object} 日历的扩展配置,允许设置一些高级功能,如日历是否允许跨月,特殊的range算法等等
toolbox.header
{Boolean} 是否显示日历的头部,一般用于横向日历时为true
toolbox.monthHeader
{Boolean} 是否显示日历的月头部,一般在纵向日历时为true
toolbox.rangeEdge
{Function} 默认值null,type='range'时,自定义range选择算法
toolbox.discontinue
{Boolean} 默认false,当日历有data数组构建时,缺少数据的月份会被忽略
如何设置
设置横向、纵向日历
let calenderConfig = { $$id: 'calendar', mode: 2, // 1,纵向日历 2,横向日历 type: 'single', // single:单选 range: 区间选择 multiple:多选 tap: 'onTap', // 回调事件 total: 180, // 所有日期选择天数 methods: { // 响应方法 onTap(e, param, inst) { console.log(param); } } }
设置区间选择日历
该示例配置为仿携程的功能设置
let calendarConfig = { $$id: 'calendar', //实例id mode: 1, // 纵向日历 type: 'range', // 区间选择日历 tap: 'onTap', // tap响应方法 total: 365, // 指定日历从今天开始总天数 rangeCount: 28, // 区间范围 rangeMode: 1, // 区间选择是否隐藏非区间的月份 festival: true, // 是否显示节假日 value: ['2020-04-03', '2020-04-09'], // 默认值 methods: { // 定义响应方法 onTap(e, param, inst) { if (param.range === 'start') { // 第一次点击时 inst.update({dot: [{title: '入住'}]}) } if (param.range === 'end') { // 第二次点击时 inst.update({dot: [{title: '离店'}]}) } console.log(param); } } }
设置多选日历
支持选中多个日期
let calenderConfig = { $$id: 'calendar', mode: 2, type: 'multiple', // single:单选 range: 区间选择 multiple:多选 tap: 'onTap', // 回调事件 total: 180, // 所有日期选择天数 value: ['2020-04-03', '2020-04-09', '2020-04-10'], methods: { // 响应方法 onTap(e, param, inst) { console.log(param); } } }
据已知日期自动构建
此例中total无效,由两个给定的日期构建了三个月的日历
let calenderConfig = { $$id: 'calendar', mode: 2, // 1,纵向日历 2,横向日历 type: 'single', // single:单选 range: 区间选择 multiple:多选 tap: 'onTap', // 回调事件 total: 180, // 所有日期选择天数,此例中无效 data: [{"date":"2020-04-03"}, {"date":"2020-06-03"}], methods: { // 响应方法 onTap(e, param, inst) { console.log(param); } } },
根据已知日期自动构建,忽略无数据月份
此例中total无效, 由两个给定的日期构建了三个月的日历
let calenderConfig = { $$id: 'calendar', mode: 2, // 1,纵向日历 2,横向日历 type: 'single', // single:单选 range: 区间选择 multiple:多选 tap: 'onTap', // 回调事件 total: 180, // 所有日期选择天数,此例中无效 data: [{"date":"2020-04-03"}, {"date":"2020-06-03"}], toolbox: { discontinue: true // 允许构建跨月日历 }, methods: { // 响应方法 onTap(e, param, inst) { console.log(param); } } },
构建节假日日历
允许指定节假日,指定节假日内容
festival: true
显示所有组件自带节日
festival: ['元旦节', '情人节', '劳动节', '冬至']
显示指定假日
festival: [{title: '春节', content: {dot: ['新年好']}}]
显示指定节日,并附加内容
let calenderConfig = { $$id: 'calendar', mode: 1, // 1,纵向日历 2,横向日历 type: 'single', // single:单选 range: 区间选择 multiple:多选 tap: 'onTap', // 回调事件 data: [{"date":"2020-09-03"}, {"date":"2020-12-28"}], festival: ['教师节', '圣诞节'], toolbox: { discontinue: true // 允许忽略无数据月份 }, methods: { // 响应方法 onTap(e, param, inst) { console.log(param); } } },
自定义日期内容
自定义日期内容有两种方法
在data数据配置中加入'dot'数组属性
config.data = [{date: '2020-03-03', content: {dot: ['内容']}}]
在date属性中配置
// 配置所有日期的附加内容 config.date = {dot: ['自定义内容']} // 指定日期内容配置 config.date = function(param){ // 通过param的属性写逻辑 param.date, param.year, param.month, param.day ... if (param.date === '2020-8-13') { param.dot = ['附加内容'] return param } }
设置示例
let calenderConfig = { $$id: 'calendar', mode: 2, // 1,纵向日历 2,横向日历 type: 'single', // single:单选 range: 区间选择 multiple:多选 tap: 'onTap', // 回调事件 date: function(param){ if (param.month === 12 && param.day === 26) { param.dot = ['毛主席诞辰'] return param } if (param.month === 9 && param.day === 10) { param.dot = [ {title: '生日', itemStyle: 'font-size: 11px; color: blue;'}, {title: '骗你的', itemStyle: 'font-size: 11px; color: #666'}, ] return param } if (param.month === 9 && param.day === 20) { param.dot = [ {title: '无效日期', itemStyle: 'font-size: 12px; color: red;'}, {title: '不能交互', itemStyle: 'font-size: 12px; color: #666;'}, ] param.disable = true return param } }, toolbox: { discontinue: true }, data: [{"date":"2020-09-03"}, {"date":"2020-12-28"}], methods: { // 响应方法 onTap(e, param, inst) { console.log(param); } } },
GITHUB源码
示例小程序
小程序日历组件,小程序日历
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 【雨果唱片】中国管弦乐《鹿回头》WAV
- APM亚流新世代《一起冒险》[FLAC/分轨][106.77MB]
- 崔健《飞狗》律冻文化[WAV+CUE][1.1G]
- 罗志祥《舞状元 (Explicit)》[320K/MP3][66.77MB]
- 尤雅.1997-幽雅精粹2CD【南方】【WAV+CUE】
- 张惠妹.2007-STAR(引进版)【EMI百代】【WAV+CUE】
- 群星.2008-LOVE情歌集VOL.8【正东】【WAV+CUE】
- 罗志祥《舞状元 (Explicit)》[FLAC/分轨][360.76MB]
- Tank《我不伟大,至少我能改变我。》[320K/MP3][160.41MB]
- Tank《我不伟大,至少我能改变我。》[FLAC/分轨][236.89MB]
- CD圣经推荐-夏韶声《谙2》SACD-ISO
- 钟镇涛-《百分百钟镇涛》首批限量版SACD-ISO
- 群星《继续微笑致敬许冠杰》[低速原抓WAV+CUE]
- 潘秀琼.2003-国语难忘金曲珍藏集【皇星全音】【WAV+CUE】
- 林东松.1997-2039玫瑰事件【宝丽金】【WAV+CUE】