Skip to content
专业版

FaCalendarYear 年份日历

基于 shadcn-vue 风格与 Reka UI YearPicker 封装的年份选择组件,支持单选与多选,使用 @internationalized/date 处理年份值。

使用场景

  • 单年份或多年份选择面板
  • 内置按钮弹层形态的年份选择器
  • 需要限制可选年份范围的表单场景
  • 需要保留日历系统、locale、无时区日期语义的年份选择
  • 需要按年份分页浏览的选择场景

Props

属性类型默认值说明
modelValueDateValue | DateValue[]-受控选中年份,支持 v-model
defaultValueDateValue | DateValue[]-非受控初始选中年份
placeholderDateValue-受控展示年份锚点,支持 v-model:placeholder
defaultPlaceholderDateValue今天非受控初始展示年份锚点
minValueDateValue-最小可选年份
maxValueDateValue-最大可选年份
multipleboolean按值类型推断是否启用多选,modelValue / defaultValue 为数组时会自动启用
disabledbooleanfalse是否禁用
readonlybooleanfalse是否只读
localestring'zh-CN'年份格式化语言
dir'ltr' | 'rtl'跟随文档方向阅读方向
preventDeselectboolean单选 true,多选 false是否禁止点击已选年份取消选择
initialFocusbooleanfalse挂载后是否自动聚焦
isYearDisabled(year: DateValue) => boolean-判断年份是否禁用
isYearUnavailable(year: DateValue) => boolean-判断年份是否不可用
calendarLabelstring'年份选择'无障碍标签
nextPage(placeholder: DateValue) => DateValue-自定义下一页函数,默认按 yearsPerPage 后翻
prevPage(placeholder: DateValue) => DateValue-自定义上一页函数,默认按 yearsPerPage 前翻
yearsPerPagenumber12每页展示年份数,推荐使用 4 的倍数
pickerbooleanfalse是否启用内置选择器形态
openboolean-受控弹层打开状态,支持 v-model:open,仅 picker 模式生效
defaultOpenbooleanfalse非受控初始弹层打开状态,仅 picker 模式生效
pickerPlaceholderstring'选择年份'选择器按钮空值文案
formatValue(value: DateValue | DateValue[] | undefined) => string-自定义选择器按钮展示文案
closeOnSelectboolean单选 true,多选 false选择后是否自动关闭弹层
triggerClassHTMLAttributes['class']-选择器触发按钮 class
triggerVariantButtonVariants['variant']'outline'选择器触发按钮风格
triggerSizeButtonVariants['size']'default'选择器触发按钮尺寸
triggerIconstring | false'i-lucide:calendar'选择器触发按钮图标,传 false 隐藏
contentClassHTMLAttributes['class']-选择器弹层内容 class
popoverAlignPopoverContentProps['align']-选择器弹层对齐方式
popoverAlignOffsetPopoverContentProps['alignOffset']-选择器弹层对齐偏移
popoverSidePopoverContentProps['side']-选择器弹层弹出方向
popoverSideOffsetPopoverContentProps['sideOffset']-选择器弹层方向偏移
popoverCollisionPaddingPopoverContentProps['collisionPadding']-选择器弹层碰撞边距
classHTMLAttributes['class']-年份面板 class

picker

默认 picker=false,组件仍渲染年份面板。设置 picker 后会内置 FaPopoverFaButton,渲染为按钮触发的选择器。

class 始终作用于年份面板;触发按钮使用 triggerClass,弹层内容使用 contentClassdisabled 会禁用触发按钮并阻止打开;readonly 允许打开查看,但不能修改值。

默认按钮文案:空值显示 pickerPlaceholder;单值显示 value.toString();多选 1 项显示该项,超过 1 项显示 已选择 N 项

DateValue

组件值类型使用 @internationalized/dateDateValue。对外触发的 modelValueplaceholder 会统一规范为每年 11 日。

ts
import type { DateValue } from '@internationalized/date'
import { parseDate } from '@internationalized/date'

const value = shallowRef<DateValue>(parseDate('2026-01-01'))
const values = shallowRef<DateValue[]>([parseDate('2024-01-01'), parseDate('2026-01-01')])

Slots

名称说明作用域参数
heading自定义标题区date
trigger自定义选择器触发器,仅 picker 模式生效value, label, open, disabled, readonly

Events

事件名说明回调参数
update:modelValue选中年份更新,用于 v-modelvalue: DateValue | DateValue[] | undefined
change用户交互导致年份变化时触发value: DateValue | DateValue[] | undefined
update:placeholder展示年份锚点变化,用于 v-model:placeholdervalue: DateValue
update:open选择器弹层打开状态变化,用于 v-model:openvalue: boolean

注意事项

  1. 组件支持单年份和多年份选择;范围选择请使用 FaCalendarYearRange
  2. change 只响应组件内部用户交互;父组件外部修改 modelValue 不会反向触发。
  3. placeholder 是当前展示年份页的锚点日期,不是输入框占位文字。
  4. 组件默认按 yearsPerPage 翻页,翻页边界由 minValue / maxValue 控制。
  5. 不提供 layout / yearRange,如需自定义标题区可使用 heading 插槽。
  6. 对外触发的年份值会统一规范为每年 11 日。
  7. 多选模式下空值固定为 [];单选清空时由外部将 v-model 设置为 undefined
  8. modelValuedefaultValue 为数组时会自动按多选处理,仍推荐显式传入 multiple 提升可读性。
  9. picker 只改变渲染形态,不改变值类型、change 事件和面板相关 props 的语义。