Skip to content

Calendar 日历

新粗野主义风格的日历组件,基于 v-calendar DatePicker 构建,支持单日期和日期范围选择。提供粗边框 + 硬质阴影的标志性 brutal 风格,以及选中态、范围态、今天高亮等视觉反馈。

预览

Preview

基础用法

M
T
W
T
F
S
S
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2

v-model 绑定(选中日期:未选择)

M
T
W
T
F
S
S
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2

日期范围选择(isRange)

点击选择起始日期,再点击选择结束日期
M
T
W
T
F
S
S
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2

禁用状态

M
T
W
T
F
S
S
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2

安装

pnpm dlx brutx-vue@latest add calendar

需要额外安装依赖:

bash
pnpm add v-calendar

用法

单日期选择

vue
<script setup>
import { ref } from 'vue'
import { Calendar } from 'brutx-ui-vue/calendar'

const date = ref(null)
</script>

<template>
    <Calendar v-model="date" />
</template>

日期范围选择

vue
<script setup>
import { ref } from 'vue'
import { Calendar } from 'brutx-ui-vue/calendar'

const dateRange = ref(null)
</script>

<template>
    <Calendar v-model="dateRange" :is-range="true" />
</template>

禁用状态

vue
<template>
    <Calendar :disabled="true" />
</template>

Props

属性类型默认值说明
modelValueDate | Date[] | nullundefined选中的日期,支持 v-model 绑定。单日期模式为 Date,范围模式为 [Date, Date]
isRangebooleanfalse是否启用日期范围选择模式
disabledbooleanfalse禁用日历,整体变半透明且不可交互
eventsCalendarEvent[][]事件标记数据,在对应日期上显示事件指示器
eventRenderer(event: CalendarEvent) => VNode | string自定义事件渲染函数,返回 VNode 或字符串
mode'default' | 'card''default'事件显示模式:default 为圆点指示器 + Tooltip,card 为自适应高度卡片 + 胶囊徽章
classstringundefined自定义 CSS 类名

事件

事件参数说明
update:modelValueDate | Date[] | null选中日期变化时触发

插槽

Calendar 组件通过 v-calendar 的 DatePicker 提供以下插槽,可用于自定义头部和日期单元格:

插槽作用域说明
header-prev-button自定义上一月导航按钮(默认显示 ChevronLeft 图标)
header-title{ title: string }自定义头部标题(默认加粗大写显示)
header-next-button自定义下一月导航按钮(默认显示 ChevronRight 图标)
day-content{ day: object, dayProps: object, dayEvents: object }自定义日期单元格内容

事件标记

通过 events 属性在日历上标记事件,支持两种显示模式。

数据类型

ts
interface CalendarEvent {
    date: Date | string    // 事件日期
    title: string          // 事件标题
    [key: string]: unknown // 其他自定义字段
}

事件日期如果传入 YYYY-MM-DD 字符串,会按本地日期解析为当天,不经过原生 Date 对纯日期字符串的 UTC/时区推断。完整 datetime 字符串仍按浏览器原生 Date / ISO datetime 语义解析;需要跨时区一致性时,推荐直接传入 Date 对象或带时区偏移的完整 ISO 字符串。

default 模式

圆点指示器 + Tooltip,适合事件较少的场景:

vue
<script setup>
import { Calendar } from 'brutx-ui-vue/calendar'

const events = [
    { date: '2025-07-15', title: '团队会议' },
    { date: '2025-07-20', title: '产品发布' },
    { date: '2025-07-20', title: '代码审查' },
]
</script>

<template>
    <Calendar :events="events" />
</template>

card 模式

自适应高度卡片 + 胶囊徽章,适合事件较多的场景:

vue
<script setup>
import { Calendar } from 'brutx-ui-vue/calendar'

const events = [
    { date: '2025-07-15', title: '团队会议' },
    { date: '2025-07-20', title: '产品发布' },
    { date: '2025-07-20', title: '代码审查' },
]
</script>

<template>
    <Calendar :events="events" mode="card" />
</template>

自定义事件渲染

通过 eventRenderer 自定义事件的渲染内容:

vue
<script setup>
import { Calendar } from 'brutx-ui-vue/calendar'
import { h } from 'vue'

const events = [
    { date: '2025-07-15', title: '团队会议', color: 'red' },
    { date: '2025-07-20', title: '产品发布', color: 'blue' },
]

function renderEvent(event) {
    return h('span', { style: { color: event.color } }, event.title)
}
</script>

<template>
    <Calendar :events="events" :event-renderer="renderEvent" />
</template>

可访问性

  • 键盘操作:通过 v-calendar 内置支持,可使用方向键在日期间导航,Enter / Space 选择日期,Escape 关闭弹出面板(如有)
  • ARIA 属性:v-calendar 自动为日期网格管理 role="grid"role="gridcell" 等语义化属性
  • 焦点管理:导航按钮可通过 Tab 键聚焦,日期单元格支持方向键导航

蛮力铸就。