Skip to content

Calendar 日历选择器

基础用法

  • 从底部弹出的日历选择器,内部为可滑动月历 sn-calendar-view(本组件为它的弹层形态),支持 single 单选、range 范围、multiple 多选三种模式。
  • 默认为「确认事务」模式(showConfirmtrue):每次打开以 v-model 重建内部草稿,选择过程只触发 select,点击「确定」才把草稿写入 v-model 并触发 changeconfirm;点击「取消」、右上角关闭按钮或(maskClose 开启时的)遮罩会丢弃草稿并触发 cancel
  • showConfirm 设为 false 时为即时提交:每次选择直接写入 v-model 并触发 change
  • 支持通过 v-model:visible 双向控制显隐,或通过 ref 调用 open / close 方法。
  • 弹出层类组件,需直接放在 sn-page 根节点下使用。

v-model 数据形态:single 为当天零点时间戳(Number)或 nullrange 只会是 [][开始, 结束](只选一天时两端为同一天);multiple 为时间戳数组(选几个返回几个)。

vue
<template>
	<sn-page>
		<sn-button text="选择日期" type="primary" @click="openCalendar"></sn-button>
		<sn-calendar ref="calendarEle" v-model="date" title="选择日期"></sn-calendar>
	</sn-page>
</template>

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

	const calendarEle = ref<SnCalendarComponentPublicInstance | null>(null)
	const date = ref<SnCalendarValue>(null)

	function openCalendar(): void {
		calendarEle.value?.$callMethod('open')
	}
</script>

更多演示请下载 demo 查看

进阶用法

范围选择(草稿确认)

vue
<template>
	<sn-calendar v-model:visible="show" v-model="range" type="range" :max-range="7"
		title="选择日期范围" range-prompt="最多选择 7 天"></sn-calendar>
</template>

超出 maxRange 时会以 toast 提示,且本次点击不会生效。

即时提交(多选)

vue
<template>
	<sn-calendar v-model="dates" type="multiple" :show-confirm="false" allow-cancel title="多选日期"></sn-calendar>
</template>

allow-cancel 开启后,再次点击已选日期可取消选择。

自定义单日内容

vue
<template>
	<sn-calendar v-model="date" :format="formatDay" title="排班日历"></sn-calendar>
</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.weekday == 0 || day.weekday == 6) {
			return createCalendarDayContent({ suffix: '休', paint: { suffixColor: '$warning' } })
		}
		return null
	}
</script>

属性

选择行为

参数说明类型默认值可选值
v-model绑定值,形态随 type 变化(见上方基础用法说明)SnCalendarValuenull-
v-model:visible弹层显示状态(双向绑定)Booleanfalsetrue | false
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-monthyearMonthFormat 显示年月Stringyear-monthmonth | year-month
format单日内容格式化函数,可自定义文字与绘制样式,返回 null 保持默认SnCalendarDayFormatternull-
localeText内置文案配置(标题、按钮文字、星期标题、年月格式等)SnCalendarLocaleText中文默认文案见下方类型
readonly是否只读(禁用面板切换与选择)Booleanfalsetrue | false
allowCancel再次点击已选日期是否取消选择Booleanfalsetrue | false
fullFillDates是否绘制前后月份的补位日期Booleanfalsetrue | false

选中值(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

标题与按钮

参数说明类型默认值可选值
title弹层标题,空时取 localeText.titleString''-
showClose是否显示右上角关闭按钮Booleantruetrue | false
showConfirm是否显示底部「取消 / 确定」按钮;为 false 时选择结果即时写入 v-modelBooleantruetrue | false
confirmText确定按钮文字,空时取 localeText.confirmTextString''-
confirmDisabledText预留属性:确定按钮禁用态文字(当前版本未在界面使用)String''-
forceEnableConfirm值未完成选择(single 未选 / multiple 为空 / range 不足两点)时是否仍允许点击确定Booleanfalsetrue | false

弹层

参数说明类型默认值可选值
height弹层高度;为默认 560px 时按标题栏、月历视图与按钮区高度自动计算,传入其他值则固定使用String | Number560px-
maskClose点击遮罩是否关闭(关闭时会丢弃草稿并触发 cancelBooleantruetrue | false
maskOpacity遮罩透明度Number0.40~1
preventBack显示时是否阻止页面返回Booleanfalsetrue | false
aniTime显隐动画时长(ms),支持 $ 简写,空时取框架动画长时长String | Number''-
zIndex弹出层层级Number999-

月历视图

参数说明类型默认值可选值
rowHeight单行日期高度String | Number$48-
showMark预留属性(当前版本绘制中无可见效果)Booleantruetrue | false
showWatermark是否显示月份水印数字Booleantruetrue | false
watermarkColor水印颜色,支持 $ 简写,空时取主题线条文字色String''-
watermarkFontSize水印字号String | Number$96-
titlePicker点击标题是否展开年月选择面板Booleanfalsetrue | false
switchLongpress长按左右切换按钮是否连续切换(年月面板中的年步进器长按同样生效)Booleantruetrue | 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''-
titleStyle自定义标题文字样式UTSJSONObject | String''-
titleClass外部样式类String''-
closeStyle自定义关闭按钮样式UTSJSONObject | String''-
closeClass外部样式类String''-
actionsStyle自定义底部按钮区样式UTSJSONObject | String''-
actionsClass外部样式类String''-
confirmButtonStyle自定义确定按钮样式UTSJSONObject | String''-
confirmButtonClass外部样式类String''-
viewStyle自定义内部月历视图根节点样式UTSJSONObject | String''-
viewClass外部样式类String''-
viewHeaderStyle自定义月历视图头部样式UTSJSONObject | String''-
viewHeaderClass外部样式类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自定义年步进器容器样式 / 外部样式类,空时取 pickerTitleStyle / pickerTitleClassUTSJSONObject | String''-
pickerYearStepperWrapClass自定义年步进器容器样式 / 外部样式类,空时取 pickerTitleStyle / pickerTitleClassString''-
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自定义月份宫格容器样式 / 外部样式类,空时取 pickerBodyStyle / pickerBodyClassUTSJSONObject | String''-
pickerMonthsClass自定义月份宫格容器样式 / 外部样式类,空时取 pickerBodyStyle / pickerBodyClassString''-
pickerMonthStyle自定义单个月份项样式 / 外部样式类,空时取 pickerRowStyle / pickerRowClassUTSJSONObject | String''-
pickerMonthClass自定义单个月份项样式 / 外部样式类,空时取 pickerRowStyle / pickerRowClassString''-
pickerMonthTextStyle自定义月份文字样式 / 外部样式类,空时取 pickerLabelStyle / pickerLabelClassUTSJSONObject | String''-
pickerMonthTextClass自定义月份文字样式 / 外部样式类,空时取 pickerLabelStyle / pickerLabelClassString''-
pickerTitleStyle年步进器容器兜底样式 / 外部样式类(pickerYearStepperWrapStyle / Class 为空时生效)UTSJSONObject | String''-
pickerTitleClass年步进器容器兜底样式 / 外部样式类(pickerYearStepperWrapStyle / Class 为空时生效)String''-
pickerBodyStyle月份宫格兜底样式 / 外部样式类(pickerMonthsStyle / Class 为空时生效)UTSJSONObject | String''-
pickerBodyClass月份宫格兜底样式 / 外部样式类(pickerMonthsStyle / Class 为空时生效)String''-
pickerRowStyle月份项兜底样式 / 外部样式类(pickerMonthStyle / Class 为空时生效)UTSJSONObject | String''-
pickerRowClass月份项兜底样式 / 外部样式类(pickerMonthStyle / Class 为空时生效)String''-
pickerLabelStyle月份文字兜底样式 / 外部样式类(pickerMonthTextStyle / Class 为空时生效)UTSJSONObject | String''-
pickerLabelClass月份文字兜底样式 / 外部样式类(pickerMonthTextStyle / Class 为空时生效)String''-
promptStyle自定义超限提示文字样式UTSJSONObject | String''-
promptClass外部样式类String''-

事件

名称类型说明
select(value: SnCalendarValue) => Void选择日期时触发(showConfirmtrue 时基于内部草稿值)
change(value: SnCalendarValue) => Void绑定值变化时触发:showConfirmtrue 时点击确定后触发,为 false 时每次选择即时触发
confirm(value: SnCalendarValue) => Void点击确定按钮后触发,草稿此时写入 v-model
cancel() => Void点击取消按钮、关闭按钮或(maskClose 开启时的)遮罩后触发,草稿被丢弃
panel-change(detail: SnCalendarPanelChangeDetail) => Void面板所在月份变化时触发
open() => Void弹层完全打开(入场动画结束)后触发
close() => Void弹层完全关闭(离场动画结束)后触发
clickoverlay() => Void点击遮罩时触发
beforeenter() => Void入场动画开始前触发
enter() => Void入场动画开始时触发
afterenter() => Void入场动画结束后触发
beforeleave() => Void离场动画开始前触发
leave() => Void离场动画开始时触发
afterleave() => Void离场动画结束后触发

panel-change 事件返回的面板切换详情:timestamp(面板首日时间戳)、yearmonth

方法

名称参数返回值描述
open--打开日历弹层
close--关闭日历弹层,丢弃未确认的草稿
confirm--确认当前草稿(等效点击确定按钮),写入 v-model 并关闭弹层
scrollToDate(value: Number)-选中指定日期(毫秒时间戳)并跳转到其所在月份;弹层尚未渲染时会缓存该操作,打开后自动定位

插槽

名称说明
header自定义整个头部区域(标题 + 关闭按钮)
title自定义标题文字区域
footer自定义底部区域(取消 / 确定按钮组)

类型

SnCalendarValue

Number | null | Number[]:按 type 约定——single 为当天零点时间戳或 nullrange[][开始, 结束](只选一天时两端相同);multiple 为时间戳数组。赋入超出 minDate / maxDate 范围的值会被自动规范化(裁剪到范围内)。 format 相关的 SnCalendarDay / SnCalendarDayContent / SnCalendarDayPaint 等类型见 sn-calendar-view 文档的「类型」一节。

使用 MIT 协议