Skip to content

LimeCalendar 日历组件

一个功能丰富的日历组件,支持单选、多选、范围选择等多种模式。组件提供了丰富的自定义选项,可以满足各种复杂的日期选择需求,适用于预约、签到、行程安排等多种场景。

插件依赖:lime-sharedlime-style

文档链接

📚 组件详细文档请访问以下站点:

安装方法

  1. 在uni-app插件市场入口 中搜索并导入lime-calendar
  2. 导入后可能需要重新编译项目
  3. 在页面中使用l-calendar组件

注意🔔

本插件依赖的【lime-svg】是原生插件,如果购买(收费为6元)则需要自定义基座,才能使用!
若不需要【lime-svg】删除即可

代码演示

选择切换模式

默认所有月份将以平铺方式展示,不显示切换按钮,当月份过多时可能会影响页面交互性能。可以通过设置 switch-mode 属性,展示年月切换按钮。可选值:none平铺、month支持按月切换、year-month支持按年切换,也支持按月切换

html
<l-calendar v-model:visible="visible" switch-mode="year-month"></l-calendar>

选择单个日期

下面演示了结合单元格来使用日历组件的用法,日期选择完成后会触发 change 事件,返回的是日期的时间戳。

html
<l-calendar v-model:visible="visible" @change="handleConfirm"></l-calendar>
js
const date = ref('');
const visible = ref(false);
const formatDate = (date: number) => {
    return `${date.getFullYear()}/${date.getMonth() + 1}/${date.getDate()}`;
};
const handleConfirm = (value: number) => {
    date.value = formatDate(new Date(value));
};

选择多个日期

设置 typemultiple 后可以选择多个日期,此时 confirm 事件返回的 date 为数组结构的时间戳,数组包含若干个选中的日期。

html
<l-calendar v-model:visible="visible" type="multiple" @confirm="handleConfirm"></l-calendar>
js
const date = ref('');
const visible = ref(false);
const formatDate = (date: number) => {
    return `${date.getFullYear()}/${date.getMonth() + 1}/${date.getDate()}`;
};
const handleConfirm = (dates: number[]) => {
	console.log(`选择了 ${dates.length} 个日期`)
    date.value = dates.map((item):string => formatDate(new Date(item))).join('/')
};

选择日期区间

设置 typerange 后可以选择日期区间,此时 confirm 事件返回的 date 为数组结构的时间戳,数组第一项为开始时间,第二项为结束时间。

html
<l-calendar v-model:visible="visible" type="range" @confirm="handleConfirm"></l-calendar>
js
const date = ref('');
const visible = ref(false);
const formatDate = (date: number) => {
    return `${date.getFullYear()}/${date.getMonth() + 1}/${date.getDate()}`;
};
const handleConfirm = (dates: number[]) => {
    date.value = `${formatDate(new Date(dates[0]))} - ${formatDate(new Date(dates[1]))}`;
};

自定义颜色

通过 color 属性可以自定义日历的颜色,对选中日期和底部按钮生效。

html
<l-calendar v-model:visible="visible" color="#e34d59"></l-calendar>

自定义日期范围

通过 min-datemax-date 定义日历的范围。

html
<l-calendar v-model:visible="visible" :minDate="minDate" :maxDate="maxDate"></l-calendar>
js
const minDate = new Date(2022, 0, 10).getTime()
const maxDate = new Date(2027, 10, 27).getTime()

自定义按钮文字

通过 confirm-btn 设置按钮文字,也可以是object,此时为Button的属性, confirm-disabled-text 设置按钮禁用时的文字。

html
<l-calendar v-model:visible="visible" type="range" confirm-btn="确认" confirm-disabled-text="请选择结束时间"></l-calendar>

自定义日期文案

通过传入 format 函数来对日历上每一格的内容进行格式化。

html
<l-calendar v-model:visible="visible" type="range" confirm-btn="确认" :format="customFormat"></l-calendar>
js
// 非uniappx 不需要指定类型
import { LDate } from '@/uni_modules/lime-calendar';

const customFormat = (day : LDate) : LDate => {
	const { date } = day;
	const year = date.getFullYear();
	const month = date.getMonth() + 1;
	const curDate = date.getDate();

	day.suffix = '¥60';

	if (year == 2025) {
		if (month == 2) {
			const map = new Map<number, string>([
				[1, '初一'],
				[2, '初二'],
				[3, '初三'],
				[14, '情人节'],
				[15, '元宵节'],
			])
			if (map.has(curDate)) {
				day.prefix = map.get(curDate);
				day.prefixStyle = { color: '#e34d59' }
				day.textStyle = { color: '#e34d59' }
				day.suffix = '¥100';
			}
			if (day.type == 'start') {
				day.suffix = '入住';
			} else if (day.type == 'end') {
				day.suffix = '离店';
			}
		}
	}

	return day;
};

日期区间最大范围

选择日期区间或多选日期时,可以通过 max-range 属性来指定最多可选天数,选择的范围超过最多可选天数时,会弹出相应的提示文案。

html
<l-calendar v-model:visible="visible" type="range" confirm-btn="确认" :max-range="3"></l-calendar>

自定义周起始日

通过 first-day-of-week 属性设置一周从哪天开始。

html
<l-calendar v-model:visible="visible" type="range" confirm-btn="确认" :firstDayOfWeek="1"></l-calendar>

不使用popup

插件提供了子组件l-calendar-view,该组件不带弹窗。

html
<l-calendar-view type="range" confirm-btn="确认" :firstDayOfWeek="1"></l-calendar-view>

快速预览

导入插件后,可以直接使用以下标签查看演示效果:

html
<!-- 代码位于 uni_modules/lime-calendar/components/lime-calendar -->
<lime-calendar />

插件标签说明

标签名说明
l-calendar组件标签
lime-calendar演示标签

Vue2使用说明

main.js中添加以下代码:

js
// vue2项目中使用
import Vue from 'vue'
import VueCompositionAPI from '@vue/composition-api'
Vue.use(VueCompositionAPI)

详细配置请参考官方文档:Vue Composition API

API文档

Props 属性说明

属性名说明类型默认值
confirmBtn确认按钮。值为 null 则不显示确认按钮。值类型为字符串,则表示自定义按钮文本,值类型为 Object 则表示透传 Button 组件属性string | Object | null-
confirmDisabledText确认按钮处于禁用状态时的文字string-
firstDayOfWeek第一天从星期几开始,默认 0 = 周日number0
format日期格式化函数Function-
localeText国际化文案Object-
maxDate最大可选的日期,不传则默认半年后number-
minDate最小可选的日期,不传则默认今天number-
maxRange日期区间最大范围number-
rangePrompt范围选择提示文本string-
switchMode切换模式。none 表示水平方向平铺展示所有月份;month 表示支持按月切换,year-month 表示既按年切换,也支持按月切换string'month'
title标题,不传默认为"请选择日期"string-
type日历的选择类型,single = 单选;multiple = 多选; range = 区间选择string'single'
value / v-model当前选择的日期,不传则默认今天,当 type = multiple 或 range 时传入数组number | number[]-
visible是否显示日历;usePopup 为 true 时有效booleanfalse
rowHeight日期行高string-
color主题色,对底部按钮和选中日期生效string-
showMark是否显示月份背景水印booleanfalse
readonly是否为只读状态,只读状态下不能选择日期booleanfalse
fullFillDates补全格子日期,即上一个月最后几天,和下一个月前几天booleanfalse
bgColor日历背景色string-
allowCancel单选时,可取消选中booleanfalse
forceEnableConfirm是否强制启用确认按钮(覆盖默认禁用逻辑)booleanfalse

Events 事件

事件名说明回调参数
select点击并选中任意日期时触发value: number | number[]|null
confirm日期选择完成后触发,则点击确认按钮后触发value: number | number[]|null
change不显示 confirm-btn 时,完成选择时触发(暂不支持 type = multiple)value: number | number[]|null
close关闭时触发-
panel-change日历面板切换时触发(switch-mode 不为 none 时生效){ date: Date }

Slots 插槽

名称说明
default自定义日历内容
title自定义标题
footer自定义底部内容
day自定义日期内容,参数为 day: LDate

方法

通过 ref 可以获取到 Calendar 实例并调用实例方法。

方法名说明参数返回值
scrollToDate滚动到某个日期date: Date-

日期对象类型 (LDate)

typescript
type LDate = {
  date: Date;        // 日期对象
  day: number;       // 日期数字
  type: LDateType;   // 日期类型
  className?: string; // 自定义类名
  prefix?: string;   // 前缀文本
  prefixStyle?: Object; // 前缀样式
  textStyle?: Object; // 文本样式
  suffix?: string;   // 后缀文本
  suffixStyle?: Object; // 后缀样式
}

日期类型 (LDateType)

typescript
type LDateType = 'selected' | 'middle' | 'disabled' | 'start' | 'centre' | 'end' | '';

主题定制

组件提供了以下CSS变量,可用于自定义样式:

变量名称默认值描述
--l-calendar-radius$border-radius-xl日历圆角
--l-calendar-bg-color$bg-color-container日历背景色
--l-calendar-active-color$primary-color选中日期的背景色
--l-calendar-selected-colorwhite选中日期的文字颜色
--l-calendar-selected-border-radius$border-radius选中日期的圆角
--l-calendar-title-font-size18px标题字体大小
--l-calendar-title-color$text-color-1标题颜色
--l-calendar-days-color$text-color-2星期文字颜色
--l-calendar-item-color$text-color-1日期文字颜色
--l-calendar-item-suffix-color$text-color-3日期后缀文字颜色
--l-calendar-item-height46px日期项高度
--l-calendar-item-centre-color$primary-color-1范围选择中间日期的背景色
--l-calendar-item-disabled-color$text-color-4禁用日期的文字颜色
--l-calendar-switch-mode-icon-color$text-color-2切换模式图标颜色
--l-calendar-switch-mode-icon-disabled-color$text-color-4禁用状态下切换模式图标颜色
--l-calendar-month-mark-color$fill-3月份水印颜色
--l-calendar-month-mark-font-size160px月份水印字体大小
--l-calendar-month-height356px月份容器高度
--l-calendar-title-padding16px标题内边距
--l-calendar-days-padding-x16px星期栏水平内边距
--l-calendar-days-padding-y0星期栏垂直内边距
--l-calendar-days-font-size$font-size星期栏字体大小
--l-calendar-month-font-size$font-size月份字体大小
--l-calendar-month-height44px月份标题高度
--l-calendar-date-height60px日期项高度
--l-calendar-date-font-size$font-size-md日期字体大小
--l-calendar-header-border-color$border-color-2头部边框颜色

支持与赞赏

如果你觉得本插件解决了你的问题,可以考虑支持作者:

支付宝赞助微信赞助

源代码

组件源码