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


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 表单规则集合对象
Jul 21 Javascript
Javascript UrlDecode函数代码
Jan 09 Javascript
javascript 获取所有id中包含某关键字的控件的实现代码
Nov 25 Javascript
Jquery带搜索框的下拉菜单
May 06 Javascript
jquery easyui combobox模糊过滤(示例代码)
Nov 30 Javascript
简单谈谈javascript中的变量、作用域和内存问题
Aug 30 Javascript
jquery实现浮动在网页右下角的彩票开奖公告窗口代码
Sep 04 Javascript
JavaScript的ExtJS框架中数面板TreePanel的使用实例解析
May 21 Javascript
bootstrap table单元格新增行并编辑
May 19 Javascript
vue单个组件实现无限层级多选菜单功能
Apr 10 Javascript
JS数组push、unshift、pop、shift方法的实现与使用方法示例
Apr 29 Javascript
vue中使用vue-pdf的方法详解
Sep 05 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
ie6 动态缩略图不显示的原因
2009/06/21 PHP
php使用mysqli向数据库添加数据的方法
2015/03/20 PHP
php删除txt文件指定行及按行读取txt文档数据的方法
2017/01/30 PHP
css把超出的部分显示为省略号的方法兼容火狐
2008/07/23 Javascript
js URL参数的拼接方法比较
2012/02/15 Javascript
通过上下左右键和回车键切换光标实现代码
2013/03/08 Javascript
jQuery绑定事件on()与弹窗的简要概述
2016/04/27 Javascript
微信js-sdk分享功能接口常用逻辑封装示例
2016/10/13 Javascript
纯javascript版日历控件
2016/11/24 Javascript
如何实现json数据可视化详解
2016/11/24 Javascript
微信小程序开发之map地图实现教程
2017/06/08 Javascript
使用ef6创建oracle数据库的实体模型遇到的问题及解决方案
2017/11/09 Javascript
jQuery实现获取动态添加的标签对象示例
2018/06/28 jQuery
为vue项目自动设置请求状态的配置方法
2019/06/09 Javascript
JavaScript编码小技巧分享
2020/09/17 Javascript
Python实现的数据结构与算法之基本搜索详解
2015/04/22 Python
wxPython的安装图文教程(Windows)
2017/12/28 Python
Python统计单词出现的次数
2018/04/04 Python
浅谈numpy数组中冒号和负号的含义
2018/04/18 Python
一条命令解决mac版本python IDLE不能输入中文问题
2018/05/15 Python
Django contenttypes 框架详解(小结)
2018/08/13 Python
tensorflow对图像进行拼接的例子
2020/02/05 Python
速比涛英国官网:Speedo英国
2019/07/15 全球购物
英国最大的汽车配件在线商店:Euro Car Parts
2019/09/30 全球购物
编程用JAVA解析XML的方式
2013/07/07 面试题
2014年上半年工作自我评价
2014/01/18 职场文书
《狐假虎威》教学反思
2014/02/07 职场文书
自主招生学校推荐信
2014/09/26 职场文书
2014小学年度工作总结
2014/12/20 职场文书
中学感恩教育活动总结
2015/05/05 职场文书
2015年出纳工作总结与计划
2015/05/18 职场文书
债务纠纷代理词
2015/05/25 职场文书
美丽人生观后感
2015/06/03 职场文书
CSS 圆形进度栏
2021/04/06 HTML / CSS
MySQL的join buffer原理
2021/04/29 MySQL
解决Pytorch修改预训练模型时遇到key不匹配的情况
2021/06/05 Python