Skip to content

CalendarView 月历视图

基础用法

  • 本组件为 sn-calendar 的视图形态:内联在页面中的可滑动月历(无弹层),sn-calendar(弹层日历)与 sn-calendar-punch(签到日历)均基于它封装,也可单独使用。
  • 点击左右箭头按钮或横向滑动切换月份,长按箭头可连续切换;titlePicker 开启后点击标题展开年月选择面板(年步进器 + 12 月宫格)。
  • 日期格基于 Canvas 绘制,当前月中央叠加月份数字水印。
  • 支持 single 单选、range 范围、multiple 多选三种模式:single 的 v-model 为当天零点时间戳或 nullrange 只会是 [][开始, 结束](只选一天时两端为同一天);multiple 为时间戳数组。
  • minDate 默认当天、maxDate 默认当天起 6 个月,超出范围的日期禁用;赋入超界的值会被自动规范化。maxRange 限制范围天数(含首尾)或多选个数,超出时以 toast 提示且本次选择不生效。
  • Web 端额外支持鼠标点击与拖动选择;主题(颜色)变化时自动重绘。
vue
<template>
	<sn-calendar-view v-model="date" type="single" height="420px"></sn-calendar-view>
</template>

<script lang="uts" setup>
	import type { SnCalendarValue } from '@/uni_modules/sinle-ui/index.uts'

	const date = ref<SnCalendarValue>(null)
</script>

更多演示请下载 demo 查看

进阶用法

范围选择与跳转日期

vue
<template>
	<sn-calendar-view ref="viewEle" v-model="range" type="range" :max-range="7"
		height="420px" title-picker></sn-calendar-view>
</template>

<script lang="uts" setup>
	import { dayuts } from '@/uni_modules/sinle-ui/index.uts'
	import type { SnCalendarValue } from '@/uni_modules/sinle-ui/index.uts'

	const viewEle = ref<SnCalendarViewComponentPublicInstance | null>(null)
	const range = ref<SnCalendarValue>([])

	function jump(): void {
		viewEle.value?.$callMethod('scrollToDate', dayuts('2032-06-15').startOf('day').valueOf())
	}
</script>

scrollToDate 会选中目标日期并跳转到其所在月份;title-picker 开启后也可点击标题展开年月面板跳转。

自定义单日内容与圆点

vue
<template>
	<sn-calendar-view v-model="date" :format="formatDay" full-fill-dates></sn-calendar-view>
</template>

<script lang="uts" setup>
	import { createCalendarDayContent } from '@/uni_modules/sinle-ui/index.uts'
	import type { SnCalendarDay, SnCalendarDayFormatter, SnCalendarValue } from '@/uni_modules/sinle-ui/index.uts'

	const date = ref<SnCalendarValue>(null)

	const formatDay: SnCalendarDayFormatter = (day: SnCalendarDay) => {
		if (day.date % 5 == 0) {
			return createCalendarDayContent({ showDot: true, dotColor: '$success', dotPosition: 'bottom' })
		}
		return null
	}
</script>

full-fill-dates 开启后绘制前后月份的补位日期。

属性

参数说明类型默认值可选值
v-model绑定值,形态随 type 变化(见基础用法说明)SnCalendarValuenull-
type选择模式Stringsinglesingle | range | multiple
minDate最小可选日期(毫秒时间戳),默认当天Numbernull-
maxDate最大可选日期(毫秒时间戳),默认当天起 6 个月Numbernull-
maxRange限制范围选择的天数(含首尾)或多选的个数,0 表示不限制Number0-
rangePrompt超出 maxRange 时的提示文字,{maxRange} 会被替换为实际值,空时取 localeText.rangePromptString''-
firstDayOfWeek每周第一天(0 为周日)Number00~6
switchMode面板标题显示模式:month 显示「N月」,year-month 按 yearMonthFormat 显示年月Stringyear-monthmonth | year-month
format单日内容格式化函数,可自定义文字与绘制样式,返回 null 保持默认SnCalendarDayFormatternull-
localeText内置文案配置(星期标题、年月格式、超限提示等)SnCalendarLocaleText中文默认文案见下方类型
rowHeight单行日期高度String | Number$48-
height视图整体高度String | Number$420-
showMark预留属性(当前版本绘制中无可见效果)Booleantruetrue | false
showWatermark是否显示月份水印数字Booleantruetrue | false
watermarkColor水印颜色,支持 $ 简写,空时取主题线条文字色String$lineText-
watermarkFontSize水印字号String | Number$96-
titlePicker点击标题是否展开年月选择面板Booleanfalsetrue | false
switchLongpress长按左右切换按钮是否连续切换(年月面板中的年步进器长按同样生效)Booleantruetrue | false
readonly是否只读(禁用面板切换与选择)Booleanfalsetrue | false
fullFillDates是否绘制前后月份的补位日期Booleanfalsetrue | false
allowCancel再次点击已选日期是否取消选择Booleanfalsetrue | false
dayTextColor日期文字颜色,空时取主题文字色String''-
adjacentDayTextColor非当前月日期文字颜色,空时取主题线条文字色String''-
disabledDayTextColor禁用日期文字颜色,空时取主题禁用文字色String''-
selectedDayTextColor选中日期文字颜色,空时取主题主色文字色String''-
selectedDayBgColor选中日期背景色,空时取主题主色String''-
rangeDayTextColor范围中间日期文字颜色,空时取主题浅主色文字色String''-
rangeDayBgColor范围中间日期背景色,空时取主题浅主色String''-
prefixTextColor日期上标文字颜色,空时随日期文字颜色String''-
suffixTextColor日期下标文字颜色,空时随日期文字颜色String''-
todayBorderColor今天日期描边颜色,空时取主题主色String''-
dayFontSize日期字号String | Number$14-
prefixFontSize上标字号String | Number$8-
suffixFontSize下标字号String | Number$8-
dayRadius日期气泡圆角String | Number$6-
dayGap日期气泡与单元格边缘的间距String | Number$2-
customStyle自定义根节点样式UTSJSONObject | String''-
customClass外部样式类String''-
headerStyle自定义头部样式UTSJSONObject | String''-
headerClass外部样式类String''-
switchStyle自定义月份切换按钮样式UTSJSONObject | String''-
switchClass外部样式类String''-
weekdaysStyle自定义星期标题行样式UTSJSONObject | String''-
weekdaysClass外部样式类String''-
weekdayStyle自定义单个星期标题样式UTSJSONObject | String''-
weekdayClass外部样式类String''-
monthsStyle自定义月份滑动区样式UTSJSONObject | String''-
monthsClass外部样式类String''-
monthStyle自定义单月容器样式UTSJSONObject | String''-
monthClass外部样式类String''-
monthTitleStyle自定义月份标题文字样式UTSJSONObject | String''-
monthTitleClass外部样式类String''-
watermarkStyle自定义月份水印样式UTSJSONObject | String''-
watermarkClass外部样式类String''-
pickerLayerStyle自定义年月面板遮罩层样式UTSJSONObject | String''-
pickerLayerClass外部样式类String''-
pickerPanelStyle自定义年月面板容器样式UTSJSONObject | String''-
pickerPanelClass外部样式类String''-
pickerHeaderStyle自定义年月面板头部样式UTSJSONObject | String''-
pickerHeaderClass外部样式类String''-
pickerYearStepperWrapStyle自定义年步进器容器样式UTSJSONObject | String''-
pickerYearStepperWrapClass外部样式类String''-
pickerYearStepperStyle自定义年步进器样式UTSJSONObject | String''-
pickerYearStepperSize年步进器尺寸String | Number$32-
pickerYearStepperSpacing年步进器内间距String | Number$8-
pickerYearStepperInputWidth年份输入框宽度String | Number$92-
pickerYearStepperTextSize年步进器文字字号String | Number$16-
pickerYearStepperTextColor年步进器文字颜色,支持 $ 简写String$text-
pickerYearStepperInputTextColor年份输入框文字颜色,支持 $ 简写String$text-
pickerYearStepperDisabledTextColor禁用态文字颜色,支持 $ 简写String$disabledText-
pickerYearStepperInputBgColor年份输入框背景色,支持 $ 简写String$page-
pickerYearStepperInputActiveBgColor年份输入框激活背景色,支持 $ 简写String$page-
pickerYearStepperDisabledBgColor禁用态背景色,支持 $ 简写String''-
pickerYearStepperButtonBgColor步进按钮背景色,支持 $ 简写String$page-
pickerYearStepperBorderRadius年步进器圆角String | Number$8-
pickerYearStepperShowBorder年步进器是否显示边框Booleanfalsetrue | false
pickerYearStepperBorderColor边框颜色,支持 $ 简写String''-
pickerYearStepperActiveBorderColor激活态边框颜色,支持 $ 简写String''-
pickerYearStepperBorderWidth边框宽度String | Number2-
pickerYearStepperTextFont年步进器文字字体String''-
pickerYearStepperCursorColor输入光标颜色,支持 $ 简写String''-
pickerMonthsStyle自定义月份宫格容器样式UTSJSONObject | String''-
pickerMonthsClass外部样式类String''-
pickerMonthStyle自定义单个月份项样式UTSJSONObject | String''-
pickerMonthClass外部样式类String''-
pickerMonthTextStyle自定义月份文字样式UTSJSONObject | String''-
pickerMonthTextClass外部样式类String''-
promptStyle自定义超限提示文字样式UTSJSONObject | String''-
promptClass外部样式类String''-

选中值(v-model),随 type 变化:single 为时间戳 number \| nullrange[][start, end](单点范围写成 [same, same]);multiple 为时间戳数组 number[]

类型说明
number | nullsingle 模式:时间戳或空
number[]multiple 模式:时间戳数组
[] | [start, end]range 模式:空或起止时间戳(单点范围写成 [same, same]

日期格格式化器:返回 null 表示使用默认内容。

参数类型说明
daySnCalendarDay日期格信息
返回值SnCalendarDayContent | null格式化后的内容,null 表示使用默认内容

日历文案配置。

名称类型必填描述
titleString弹层标题文案(视图内未使用,供弹层形态使用),默认 日期选择
confirmTextString确定按钮文案(供弹层形态使用),默认 确定
confirmDisabledTextString确定按钮禁用态文案,默认 请选择日期
rangePromptString超出 maxRange 提示文字,默认 选择天数不能超过 {maxRange} 天
weekdaysString[]星期标题(从周日开始排列),默认 ['日', '一', '二', '三', '四', '五', '六']
yearMonthFormatString年月标题格式,默认 YYYY-MM

事件

名称类型说明
select(value: SnCalendarValue) => Void选择日期时触发
change(value: SnCalendarValue) => Void绑定值变化时触发(与 select 同时触发)
panel-change(detail: SnCalendarPanelChangeDetail) => Void面板所在月份变化时触发(箭头切换、滑动、年月面板跳转均会触发)

panel-change 事件返回的面板切换详情。

名称类型必填描述
timestampNumber当前面板月份第一天零点毫秒时间戳
yearNumber
monthNumber月(1~12)

方法

名称参数返回值描述
scrollToDate(value: Number)-选中指定日期(毫秒时间戳,自动裁剪到范围内)并跳转到其所在月份

类型

SnCalendarType

选择模式:'single'(单选)| 'multiple'(多选)| 'range'(范围)。

SnCalendarValue

Number | null | Number[]:按 type 约定——single 为当天零点时间戳或 nullrange[][开始, 结束](只选一天时两端相同);multiple 为时间戳数组。

SnCalendarSwitchMode

面板标题显示模式:'month'(按月显示)| 'year-month'(按年月显示)。

单日数据,format 格式化函数的入参。

名称类型必填描述
timestampNumber当天零点毫秒时间戳
yearNumber
monthNumber月(1~12)
dateNumber日(1~31)
weekdayNumber星期(0~6,0 为周日)
textString日期文字(默认为「日」数字)
prefixString上标文字(默认空)
suffixString下标文字(默认空)
todayBoolean是否今天
disabledBoolean是否禁用(超出 minDate / maxDate
currentMonthBoolean是否属于当前面板月份
stateSnCalendarDayState选中状态
paintSnCalendarDayPaint | null绘制覆盖

日期格状态:普通 / 选中 / 范围起点 / 范围中间 / 范围终点 / 起终点同日。

可选值备注
normal普通
selected选中
range-start范围起点
range-middle范围中间
range-end范围终点
range-start-end起终点同日

日期格绘制配置(由 SnCalendarDayContent.paint 携带,经 formatter 或 createCalendarDayPaint 构造)。

名称类型必填描述
backgroundColorString背景颜色
borderColorString边框颜色
borderWidthNumber边框宽度
fontSizeString | Number日期字号
prefixColorString前缀文字颜色
textColorString日期文字颜色
suffixColorString后缀文字颜色
prefixFontSizeNumber前缀字号
suffixFontSizeNumber后缀字号
fontWeightString字重
showDotBoolean是否显示圆点
dotColorString圆点颜色
dotPositionSnCalendarDayDotPosition圆点位置

圆点标记位置。

可选值备注
left左侧
right右侧
top顶部
bottom底部

SnCalendarDayFormatter

(day: SnCalendarDay) => SnCalendarDayContent | null:单日内容格式化函数。返回 null 保持默认渲染;返回的 prefix / text / suffix / paint 仅覆盖对应字段。推荐使用工厂函数 createCalendarDayContent / createCalendarDayPaint 构造返回值(均已从插件出口 @/uni_modules/sinle-ui/index.uts 导出)。

名称类型必填描述
prefixString | null上标文字
textString | null日期文字
suffixString | null下标文字
paintSnCalendarDayPaint | null绘制覆盖

圆点标记位置。

可选值备注
left左侧
right右侧
top顶部
bottom底部

使用 MIT 协议