更新记录

0.1.9(2025-10-15)

  • fix: 去掉版本判断

0.1.8(2025-09-23)

  • fix: 修复鸿蒙崩溃的问题

0.1.7(2025-09-22)

  • feat: 增加zIndex
查看更多

平台兼容性

uni-app(4.54)

Vue2 Vue3 Chrome Safari app-vue app-nvue Android iOS 鸿蒙
- 5.0
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 快应用-华为 快应用-联盟
- - - - - - - - -

uni-app x(4.61)

Chrome Safari Android iOS 鸿蒙 微信小程序
5.0

lime-calendar 日历组件

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

插件依赖:lime-sharedlime-style

文档链接

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

安装方法

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

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

代码演示

选择切换模式

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

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

选择单个日期

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

<l-calendar v-model:visible="visible" @change="handleConfirm"></l-calendar>
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 为数组结构的时间戳,数组包含若干个选中的日期。

<l-calendar v-model:visible="visible" type="multiple" @confirm="handleConfirm"></l-calendar>
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 为数组结构的时间戳,数组第一项为开始时间,第二项为结束时间。

<l-calendar v-model:visible="visible" type="range" @confirm="handleConfirm"></l-calendar>
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 属性可以自定义日历的颜色,对选中日期和底部按钮生效。

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

自定义日期范围

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

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

自定义按钮文字

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

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

自定义日期文案

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

<l-calendar v-model:visible="visible" type="range" confirm-btn="确认" :format="customFormat"></l-calendar>
// 非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 属性来指定最多可选天数,选择的范围超过最多可选天数时,会弹出相应的提示文案。

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

自定义周起始日

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

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

不使用popup

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

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

快速预览

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

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

插件标签说明

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

Vue2使用说明

main.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 = 周日 number 0
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 时有效 boolean false
rowHeight 日期行高 string -
color 主题色,对底部按钮和选中日期生效 string -
showMark 是否显示月份背景水印 boolean false
readonly 是否为只读状态,只读状态下不能选择日期 boolean false
fullFillDates 补全格子日期,即上一个月最后几天,和下一个月前几天 boolean false
bgColor 日历背景色 string -
allowCancel 单选时,可取消选中 boolean false
forceEnableConfirm 是否强制启用确认按钮(覆盖默认禁用逻辑) boolean false
zIndex 层级 number -

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)

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

日期类型 (LDateType)

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-color white 选中日期的文字颜色
--l-calendar-selected-border-radius $border-radius 选中日期的圆角
--l-calendar-title-font-size 18px 标题字体大小
--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-height 46px 日期项高度
--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-size 160px 月份水印字体大小
--l-calendar-month-height 356px 月份容器高度
--l-calendar-title-padding 16px 标题内边距
--l-calendar-days-padding-x 16px 星期栏水平内边距
--l-calendar-days-padding-y 0 星期栏垂直内边距
--l-calendar-days-font-size $font-size 星期栏字体大小
--l-calendar-month-font-size $font-size 月份字体大小
--l-calendar-month-height 44px 月份标题高度
--l-calendar-date-height 60px 日期项高度
--l-calendar-date-font-size $font-size-md 日期字体大小
--l-calendar-header-border-color $border-color-2 头部边框颜色

支持与赞赏

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

支付宝赞助 微信赞助

隐私、权限声明

1. 本插件需要申请的系统权限列表:

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率: