主题
LimeCalendar 日历组件
一个功能丰富的日历组件,支持单选、多选、范围选择等多种模式。组件提供了丰富的自定义选项,可以满足各种复杂的日期选择需求,适用于预约、签到、行程安排等多种场景。
插件依赖:
lime-shared
、lime-style
文档链接
📚 组件详细文档请访问以下站点:
安装方法
注意🔔
本插件依赖的【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));
};
选择多个日期
设置 type
为 multiple
后可以选择多个日期,此时 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('/')
};
选择日期区间
设置 type
为 range
后可以选择日期区间,此时 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-date
和 max-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 = 周日 | 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 |
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-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 | 头部边框颜色 |
支持与赞赏
如果你觉得本插件解决了你的问题,可以考虑支持作者:
支付宝赞助 | 微信赞助 |
---|---|
![]() | ![]() |