FullCalendar React v5如何为外部按钮绑定prev/next翻页功能
React 17 环境下 FullCalendar v5 外部按钮绑定日期切换实现方案
这个需求完全可实现,FullCalendar v5 原生提供了实例API支持外部触发所有内置操作,不需要依赖旧版jQuery的实现方案。
原有代码不生效的原因
之前的写法没有通过绑定的ref获取FullCalendar的日历实例,直接调用dateIncrement无法关联到已渲染的日历组件。所有日历操作方法都挂载在ref指向组件的getApi()返回的实例对象上。
具体实现步骤
- 保留已有的ref绑定逻辑,建议将ref命名语义化(比如
calendarRef避免和其他ref混淆) - 在外部按钮的点击回调中,先通过
ref.current.getApi()拿到日历实例,再调用对应内置方法:- 要完全复用头部原生
prev按钮的逻辑(自动适配当前视图的切换步长:日视图切1天、周视图切1周、月视图切1月),直接调用实例的prev()方法即可 - 如果需要固定切换步长(比如无论当前是什么视图都切1天),再调用
dateIncrement()方法传入偏移参数
- 要完全复用头部原生
- 不需要头部原生切换按钮的话,直接在
headerToolbar配置里移除对应按钮项即可,不会影响外部API的调用
修正后的完整代码示例
import { useRef } from 'react' import FullCalendar from '@fullcalendar/react' // 原有插件、资源引入保持不变 const TimelineTab = ({events, resources, shiftData}) => { const calendarRef = useRef(null) // 向前切换 const handlePrev = () => { const calendarApi = calendarRef.current.getApi() // 复用原生prev按钮逻辑用这行 calendarApi.prev() // 固定向前切1天就注释上面一行,用下面这行 // calendarApi.dateIncrement({ days: -1 }) } // 向后切换(需要外部next按钮可复用) const handleNext = () => { const calendarApi = calendarRef.current.getApi() calendarApi.next() // 固定向后切1天用下面这行 // calendarApi.dateIncrement({ days: 1 }) } // 回到今日(需要外部today按钮可复用) const handleToday = () => { const calendarApi = calendarRef.current.getApi() calendarApi.today() } return ( <section> <div className='app-user-list'> <button size='12' color='primary' onClick={handlePrev}>ok</button> { events[0]?.title && <FullCalendar ref={calendarRef} schedulerLicenseKey= 'CC-Attribution-NonCommercial-NoDerivatives' contentHeight="auto" plugins={[resourceTimelinePlugin, daygridPlugin, interactionPlugin, listPlugin, timeGridPlugin]} // 不需要头部原生prev/next的话直接在配置里移除即可 headerToolbar={{ left: 'today', center: 'title', right : 'resourceTimelineDay resourceTimelineWeek resourceTimelineMonth' }} initialView='resourceTimelineDay' // 原有events、resources等其他配置保持不变 /> } </div> </section> ) } export default TimelineTab
注意:用户点击按钮触发回调时ref已经完成绑定,可以直接调用API;如果要在组件挂载初始阶段操作日历,需要把逻辑放在
useEffect回调中执行,避免ref还未挂载报错。
内容的提问来源于stack exchange,提问作者Papasof
相关产品推荐
相关产品推荐

