拖拽与选择

两个开关解锁全部交互:editable 允许用户移动和调整事件,selectable 允许在空白处拖选时间范围。组件内置了合理的弹层交互,也可以用回调完全替换。

内置弹层(零配置)

不配置任何回调时,日历开箱即用地提供类似 Google 日历的交互:点击日程弹出详情弹层(时间、所属日历、地点、描述、删除按钮);点击或框选空白区域弹出快速新建弹层,可输入标题并选择日历。

快速新建弹层在保存前可微调所选范围:开始与结束时间都是可编辑的日期/时间输入框(可精确到任意分钟,不再吸附到 slotDuration),并支持“全天”切换与跨天范围。

试试:点击日程、框选空白时段

2026/9/7 – 2026/9/13

周一
7
周二
8
周三
9
周四
10
周五
11
周六
12
周日
13
全天
1时
2时
3时
4时
5时
6时
7时
8时
9时
10时
11时
12时
13时
14时
15时
16时
17时
18时
19时
20时
21时
22时
23时
0时
优先级 — 提供 onEventClick 时详情弹层让位;提供 onSelect / onDateClick 时快速新建让位。也可以用 eventDetails={false} 或 quickCreate={false} 直接关闭内置弹层。开启 selectable 或 editable 即可使用快速新建。

用回调自定义交互

可编辑、可框选(自定义回调)

2026/9/7 – 2026/9/13

周一
7
周二
8
周三
9
周四
10
周五
11
周六
12
周日
13
全天
1时
2时
3时
4时
5时
6时
7时
8时
9时
10时
11时
12时
13时
14时
15时
16时
17时
18时
19时
20时
21时
22时
23时
0时
· drag events, resize them, or drag across empty slots ·

用户可以做什么

  • 把事件块拖到其他时间或日期(周/日视图)。
  • 把事件条拖到其他日期(月视图),或在全天栏内横向拖动全天事件。
  • 拖动事件块底边调整时长。
  • 拖动重复实例——确认弹层提供“仅此日程”或“此次及以后”。
  • 在空白时间格上拖选一个范围(触发 onSelect)。
  • 在月视图单元格上拖选一个日期范围。
  • 点击空白时间格或日期(触发 onDateClick)。
触屏设备 — 轻点等同于点击;长按约 300 毫秒(伴随触感反馈)后拖动即可移动、调整或框选——普通滑动仍然正常滚动页面。

回调

回调触发时机参数
onEventClick事件被点击或通过键盘激活(instance, mouseOrKeyboardEvent)
onDateClick空白时间格 / 日期格被点击(date, allDay)
onSelect拖选结束{ start, end, allDay }
onEventChange拖动或调整完成落地{ event, oldStart, oldEnd, start, end, revert }
onEventCreate快速新建弹层添加了日程(event)
onEventDelete日程(或系列中的某一次)被删除(event, occurrence?)
onSeriesDetach拖拽/调整导致某次从系列中拆分{ series, detached, occurrence }
onRangeChange可见日期范围变化——适合在此拉取数据(start, end)
onViewChange / onDateChange视图 / 聚焦日期变化(view) / (date)

保存到服务器并支持回滚

日历会先乐观地应用变更,再调用 onEventChange。如果 API 保存失败,调用 revert() 即可把事件弹回原位:

async function onEventChange({ event, start, end, revert }) {
  try {
    await api.updateEvent(event.id, { start, end });
  } catch {
    revert(); // restore the previous times
  }
}

权限规则

  • 组件上的 editable 是总开关。
  • source.editable = false 会锁定该日历源下的全部事件。
  • event.editable 可按事件覆盖以上两者。
  • 重复事件的实例不可拖动——一个重复系列没有单一的“时间”可供移动,请直接在数据中修改系列的 start / recurrence。