功能完善的小程序日历组件的实现


Posted in Javascript onMarch 31, 2020

小程序日历组件

日历组件,表单组件绝逼是前端开发的一个噩梦,尤其要做好一个旅游项目的日历,变态需求特别多,要在小程序中实现携程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源码

示例小程序

功能完善的小程序日历组件的实现

到此这篇关于功能完善的小程序日历组件的实现的文章就介绍到这了,更多相关小程序日历组件内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
JavaScript高级程序设计(第3版)学习笔记5 js语句
Oct 11 Javascript
JS的document.all函数使用示例
Dec 30 Javascript
JavaScript中扩展Array contains方法实例
Aug 23 Javascript
JavaScript实现倒计时代码段Item1(非常实用)
Nov 03 Javascript
Jquery easyui开启行编辑模式增删改操作
Jan 14 Javascript
js 判断各种数据类型的简单方法(推荐)
Aug 29 Javascript
Bootstrap的基本应用要点浅析
Dec 19 Javascript
vue时间格式化实例代码
Jun 13 Javascript
基于JS实现移动端左滑删除功能
Jul 28 Javascript
vue项目中导入swiper插件的方法
Jan 30 Javascript
ES6顶层对象、global对象实例分析
Jun 14 Javascript
js实现mp3录音通过websocket实时传送+简易波形图效果
Jun 12 Javascript
小程序双头slider选择器的实现示例
Mar 31 #Javascript
JavaScript实现电灯开关小案例
Mar 30 #Javascript
javascript实现计算器功能
Mar 30 #Javascript
详解Webpack抽离第三方类库以及common解决方案
Mar 30 #Javascript
记一次react前端项目打包优化的方法
Mar 30 #Javascript
12 种使用Vue 的最佳做法
Mar 30 #Javascript
javascript实现简易数码时钟
Mar 30 #Javascript
You might like
PHP持久连接mysql_pconnect()函数使用介绍
2012/02/05 PHP
PHP字符串的连接的简单实例
2013/12/30 PHP
php中url函数介绍及使用示例
2014/02/13 PHP
PHP中常用的转义函数
2014/02/28 PHP
php+mysqli实现批量替换数据库表前缀的方法
2014/12/29 PHP
thinkPHP中钩子的使用方法实例分析
2017/11/16 PHP
BOOM vs RR BO3 第二场2.13
2021/03/10 DOTA
file模式访问网页时iframe高度自适应解决方案
2013/01/16 Javascript
Extjs中的GridPanel隐藏列会显示在menuDisabled中解决方法
2013/01/27 Javascript
js批量设置样式的三种方法不推荐使用with
2013/02/25 Javascript
JS实现随机数生成算法示例代码
2013/08/08 Javascript
jquery选择器-根据多个属性选择示例代码
2013/10/21 Javascript
JavaScript动态插入script的基本思路及实现函数
2013/11/11 Javascript
js闭包的用途详解
2014/11/09 Javascript
express的中间件basicAuth详解
2014/12/04 Javascript
Jquery promise实现一张一张加载图片
2015/11/13 Javascript
基于Jquery实现仿百度百科右侧导航代码附源码下载
2015/11/27 Javascript
jQuery+ajax实现文章点赞功能的方法
2015/12/31 Javascript
JS实现图片局部放大或缩小的方法
2016/08/20 Javascript
预防网页挂马的方法总结
2016/11/03 Javascript
Jquery EasyUI Datagrid右键菜单实现方法
2016/12/30 Javascript
JavaScript装饰器函数(Decorator)实例详解
2017/03/30 Javascript
JavaScript中的FileReader图片预览上传功能实现代码
2017/07/24 Javascript
JavaScript使用prototype原型实现的封装继承多态示例
2018/08/31 Javascript
微信小程序实现左右列表联动
2020/05/19 Javascript
详解Vue路由自动注入实践
2019/04/17 Javascript
微信小程序自定义toast组件的方法详解【含动画】
2019/05/11 Javascript
Python读取一个目录下所有目录和文件的方法
2016/07/15 Python
python调用webservice接口的实现
2019/07/12 Python
德国便宜的宠物店:Brekz.de
2020/10/23 全球购物
物流专业大学生的自我鉴定
2013/11/13 职场文书
统计员岗位职责
2013/11/14 职场文书
物业保安岗位职责
2014/07/02 职场文书
光学与应用专业毕业生求职信
2014/09/01 职场文书
2015年校本培训工作总结
2015/07/24 职场文书
利用Python实时获取steam特惠游戏数据
2022/06/25 Python