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


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 相关文章推荐
JSQL 基于客户端的成绩统计实现方法
May 05 Javascript
再论Javascript的类继承
Mar 05 Javascript
JavaScript高级程序设计 读书笔记之八 Function类及闭包
Feb 27 Javascript
使用JS或jQuery模拟鼠标点击a标签事件代码
Mar 10 Javascript
JS去除iframe滚动条的方法
Apr 01 Javascript
AngularJs Understanding the Model Component
Sep 02 Javascript
jQuery实现滚动条滚动到子元素位置(方便定位)
Jan 08 Javascript
bootstrap的常用组件和栅格式布局详解
May 02 Javascript
vue 虚拟dom的patch源码分析
Mar 01 Javascript
jQuery中$原理实例分析
Aug 13 jQuery
Webpack之tree-starking 解析
Sep 11 Javascript
使用vue编写h5公众号跳转小程序的实现代码
Nov 27 Vue.js
小程序双头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
PHPMyadmin 配置文件详解(配置)
2009/12/03 PHP
PHP对MongoDB[NoSQL]数据库的操作
2013/03/01 PHP
PHP命名空间namespace及use的简单用法分析
2018/08/03 PHP
Nigma vs Liquid BO3 第一场2.14
2021/03/10 DOTA
js用图作提交按钮或超连接
2008/03/26 Javascript
jquery操作select详解(取值,设置选中)
2014/02/07 Javascript
jquery插件开发之实现md5插件
2014/03/17 Javascript
Javascript定义类(class)的三种方法详解
2015/03/13 Javascript
JavaScript数据类型详解
2015/04/01 Javascript
js实现模糊匹配功能
2017/02/15 Javascript
Bootstrap警告框(Alert)插件使用方法
2017/03/21 Javascript
微信小程序教程系列之视图层的条件渲染(10)
2017/04/19 Javascript
JavaScript实现的原生态Tab标签页功能【兼容IE6】
2017/09/18 Javascript
在Vant的基础上封装下拉日期控件的代码示例
2018/12/05 Javascript
详解es6新增数组方法简便了哪些操作
2019/05/09 Javascript
JS前后端实现身份证号验证代码解析
2020/07/23 Javascript
vue实现PC端分辨率适配操作
2020/08/03 Javascript
javascript实现时钟动画
2020/12/03 Javascript
[02:36]DOTA2英雄基础教程 斯拉克
2013/11/29 DOTA
python显示天气预报
2014/03/02 Python
python实现的一个p2p文件传输实例
2014/06/04 Python
收藏整理的一些Python常用方法和技巧
2015/05/18 Python
深入解析Python中的集合类型操作符
2015/08/19 Python
python生成验证码图片代码分享
2016/01/28 Python
python实现简单图书管理系统
2019/11/22 Python
对tensorflow 中tile函数的使用详解
2020/02/07 Python
Python爬取微信小程序Charles实现过程图解
2020/09/29 Python
Pycharm安装python库的方法
2020/11/24 Python
Lampenwelt德国:欧洲领先的灯具和照明在线商店
2018/08/05 全球购物
zooplus波兰:在线宠物店
2019/07/21 全球购物
德国游戏机商店:Konsolenkost
2019/12/08 全球购物
后勤采购员岗位职责
2013/12/19 职场文书
毕业生简历自我评价范文
2014/04/09 职场文书
初中英语演讲稿
2014/04/29 职场文书
整改落实自查报告
2014/11/05 职场文书
红十字会救护培训简讯
2015/07/20 职场文书