所有分类
  • 所有分类
  • Html5资源
  • React资源
  • Vue资源
  • Php资源
  • ‌小程序资源
  • Python资源

FullCalendar 日历插件的使用详解

FullCalendar 是一个强大的日历插件,支持多种视图,包括日历视图、时间视图、列表视图等。它还支持事件管理、拖拽、缩放等功能。本文将详细介绍 FullCalendar 的使用方法。

  1. 丰富的API,可以满足各种需求
  2. 支持多种视图,如月视图、周视图、日视图等
  3. 支持多种插件,如时间轴、拖拽、弹出框等
  4. 支持多种事件,如事件拖拽、事件缩放、事件点击等
  5. 支持多种交互,如事件编辑、事件删除、事件添加等
  6. 支持多种主题,如Bootstrap、Material Design等
  7. 支持多种语言,如中文、英文、日文等

1. 安装

npm install fullcalendar

2. 引入

import FullCalendar from '@fullcalendar/react'
import dayGridPlugin from '@fullcalendar/daygrid'
import interactionPlugin from '@fullcalendar/interaction'

3. 使用

<FullCalendar
  plugins={[dayGridPlugin, interactionPlugin]}
/>

4. 配置

<FullCalendar
  plugins={[dayGridPlugin, interactionPlugin]}
  initialView="dayGridMonth"
  headerToolbar={{
    start: 'prev,next today',
    center: 'title',
    end: 'dayGridMonth,timeGridWeek,timeGridDay'
  }
}}

5. FullCalendar常用插件

名称说明
croe核心插件
iteraction交互插件
daygrid日历视图插件
timegrid时间视图插件
list列表视插件
multimount多视图插件
scrollgrid滚动视图插件
timeline时间线视图插件
reactReact插件
vueVue插件
vue3Vue3插件
angularAngular插件

6. FullCalendar常用属性

名称说明
plugins插件列表
initialView初始视图
headerToolbar头部工具栏
events事件列表
eventClick事件点击事件
eventDidMount事件挂载事件
eventMouseEnter事件鼠标进入事件
eventMouseLeave事件鼠标离开事件
eventDragStart事件拖拽开始事件

7. FullCalendar常用方法

名称说明
getApi获取FullCalendar实例
prev上一视图
next下一视图
today回到今天
changeView切换视图
addEventSource添加事件源
removeEventSource移除事件源
rerenderEvents重新渲染事件

8. FullCalendar常用API方法

8.1. 基本使用

import FullCalendar from '@fullcalendar/react'
import dayGridPlugin from '@fullcalendar/daygrid'
import interactionPlugin from '@fullcalendar/interaction'

const events = [
  {
    title: '事件1',
    start: '2021-01-01',
    end: '2021-01-02'
  },
  {
    title: '事件2',
    start: '2021-01-03',
    end: '2021-01-04'
  }
]

const handleEventClick = (info) => {
  console.log(info.event.title)
}

const handleEventDidMount = (info) => {
  console.log(info.event.title)
}

const handleEventMouseEnter = (info) => {
  console.log(info.event.title)
}

const handleEventMouseLeave = (info) => {
  console.log(info.event.title)
}

const handleEventDragStart = (info) => {
  console.log(info.event.title)
}


<FullCalendar
  plugins={[dayGridPlugin, interactionPlugin]}
  initialView="dayGridMonth"
  headerToolbar={{
    start: 'prev,next today',
    center: 'title',
    end: 'dayGridMonth,timeGridWeek,timeGridDay'
  }}
  events={events}
  eventClick={handleEventClick}
  eventDidMount={handleEventDidMount}
}
  eventMouseEnter={handleEventMouseEnter}
  eventMouseLeave={handleEventMouseLeave}
  eventDragStart={handleEventDragStart}
/>

8.2 跳转下个月/周/日

const calendarRef = useRef(null)

const handleNext = () => {
  calendarRef.current.getApi().next()
}

return (
  <div>
    <button onClick={handleNext}>下一月</button>
    <FullCalendar
      ref={calendarRef}
      plugins={[dayGridPlugin, interactionPlugin]}
      initialView="dayGridMonth"
      headerToolbar={{
        start: 'prev,next today',
        center: 'title',
        end: 'dayGridMonth,timeGridWeek,timeGridDay'
      }}
    />
  </div>
)

8.3 跳转上个月/周/日

const calendarRef = useRef(null)

const handlePrev = () => {
  calendarRef.current.getApi().prev()
}

return (
  <div>
    <button onClick={handlePrev}>上一月</button>
    <FullCalendar
      ref={calendarRef}
      plugins={[dayGridPlugin, interactionPlugin]}
      initialView="dayGridMonth"
      headerToolbar={{
        start: 'prev,next today',
        center: 'title',
        end: 'dayGridMonth,timeGridWeek,timeGridDay'
      }}
    />
  </div>
)

8.4 跳转到今天

const calendarRef = useRef(null)

const handleToday = () => {
  calendarRef.current.getApi().today()
}

return (
  <div>
    <button onClick={handleToday}>回到今天</button>
    <FullCalendar
      ref={calendarRef}
      plugins={[dayGridPlugin, interactionPlugin]}
      initialView="dayGridMonth"
      headerToolbar={{
        start: 'prev,next today',
        center: 'title',
        end: 'dayGridMonth,timeGridWeek,timeGridDay'
      }}
    />
  </div>
)

8.5 跳转到指定日期

const calendarRef = useRef(null)

const handleGoTo = () => {
  calendarRef.current.getApi().gotoDate('2021-01-01'); // 日期格式为 'YYYY-MM-DD'
}

return (
  <div>
    <button onClick={handleGoTo}>跳转到指定日期</button>
    <FullCalendar
      ref={calendarRef}
      plugins={[dayGridPlugin, interactionPlugin]}
      initialView="dayGridMonth"
      headerToolbar={{s
        start: 'prev,next today',
        center: 'title',
        end: 'dayGridMonth,timeGridWeek,timeGridDay'
      }}
    />
  </div>
)

8.6 获取当前视图起始日期和结束日期

const calendarRef = useRef(null)

const handleGetDates = () => {
  const api = calendarRef.current.getApi()
  const start = api.view.currentStart
  const end = api.view.currentEnd
  console.log(start, end)
}

return (
  <div>
    <button onClick={handleGetDates}>获取当前视图起始日期和结束日期</button>
    <FullCalendar
      ref={calendarRef}
      plugins={[dayGridPlugin, interactionPlugin]}
      initialView="dayGridMonth"
      headerToolbar={{
        start: 'prev,next today',
        center: 'title',
        end: 'dayGridMonth,timeGridWeek,timeGridDay'
}
      }}
    />
  </div>
)

8.7 获取当前视图类型

const calendarRef = useRef(null)

const handleGetViewType = () => {
  const api = calendarRef.current.getApi()
  const viewType = api.view.type
  console.log(viewType) // 例如:dayGridMonth, timeGridWeek, timeGridDay
}

return (
  <div>
    <button onClick={handleGetViewType}>获取当前视图类型</button>
    <FullCalendar
      ref={calendarRef}
      plugins={[dayGridPlugin, interactionPlugin]}
      initialView="dayGridMonth"
      headerToolbar={{
        start: 'prev,next today',
        center: 'title',
        end: 'dayGridMonth,timeGridWeek,timeGridDay'
      }}
    />
  </div>
)

8.8 获取当前视图的参数

const calendarRef = useRef(null)

const handleGetViewOptions = () => {
  const api = calendarRef.current.getApi()
  const viewOptions = api.view
  console.log(viewOptions)
}

return (
  <div>
    <button onClick={handleGetViewOptions}>获取当前视图的参数</button>
    <FullCalendar
      ref={calendarRef}
      plugins={[dayGridPlugin, interactionPlugin]}
      initialView="dayGridMonth"
      headerToolbar={{
        start: 'prev,next today',
        center: 'title',
        end: 'dayGridMonth,timeGridWeek,timeGridDay'
      }}
    />
  </div>
)

8.9 获取当前视图所有事件

const calendarRef = useRef(null)

const handleGetEvents = () => {
  const api = calendarRef.current.getApi()
  const events = api.getEvents()
  console.log(events)
}

return (
  <div>
    <button onClick={handleGetEvents}>获取当前视图所有事件</button>
    <FullCalendar
      ref={calendarRef}
      plugins={[dayGridPlugin, interactionPlugin]}
      initialView="dayGridMonth"
      headerToolbar={{
        start: 'prev,next today',
        center: 'title',
        end: 'dayGridMonth,timeGridWeek,timeGridDay'
}
      }}
    />
  </div>
)

8.10 添加事件

const calendarRef = useRef(null)

const handleAddEvent = () => {
  const api = calendarRef.current.getApi()
  api.addEvent({
    title: '新事件',
    start: '2021-01-01',
    end: '2021-01-02',
    allDay: true
  })
}

return (
  <div>
    <button onClick={handleAddEvent}>添加事件</button>
    <FullCalendar
      ref={calendarRef}
      plugins={[dayGridPlugin, interactionPlugin]}
      initialView="dayGridMonth"
      headerToolbar={{
        start: 'prev,next today',
        center: 'title',
        end: 'dayGridMonth,timeGridWeek,timeGridDay'
      }}
    />
  </div>
)

8.11 删除事件

const calendarRef = useRef(null)

const handleDeleteEvent = () => {
  const api = calendarRef.current.getApi()
  const events = api.getEvents()
  if (events.length > 0) {
    events[0].remove()
  }
}

return (
  <div>
    <button onClick={handleDeleteEvent}>删除事件</button>
    <FullCalendar
      ref={calendarRef}
      plugins={[dayGridPlugin, interactionPlugin]}
      initialView="dayGridMonth"
      headerToolbar={{
        start: 'prev,next today',
        center: 'title',
        end: 'dayGridMonth,timeGridWeek,timeGridDay'
      }}
    />
  </div>
)

8.12 更新事件

const calendarRef = useRef(null)

const handleUpdateEvent = () => {
  const api = calendarRef.current.getApi()
  const events = api.getEvents()
  if (events.length > 0) {
    events[0].setDates('2021-01-02', '2021-01-03')
  }
}

return (
  <div>
    <button onClick={handleUpdateEvent}>更新事件</button>
    <FullCalendar
  ref={calendarRef}
      plugins={[dayGridPlugin, interactionPlugin]}
      initialView="dayGridMonth"
      headerToolbar={{
        start: 'prev,next today',
        center: 'title',
        end: 'dayGridMonth,timeGridWeek,timeGridDay'
      }}
    />
  </div>
)

8.13 修改事件属性 如颜色等

const calendarRef = useRef(null)

const handleUpdateEventColor = () => {
  const api = calendarRef.current.getApi()
  const events = api.getEvents()
  if (events.length > 0) {
    events[0].setProp('backgroundColor', 'red')
  }
}

return (
  <div>
    <button onClick={handleUpdateEventColor}>修改事件颜色</button>
    <FullCalendar
      ref={calendarRef}
      plugins={[dayGridPlugin, interactionPlugin]}
      initialView="dayGridMonth"
      headerToolbar={{
        start: 'prev,next today',
        center: 'title',
        end: 'dayGridMonth,timeGridWeek,timeGridDay'
      }}
    />
  </div>
)

8.14 自定义prev、next、 today按钮等 customButtons

const calendarRef = useRef(null)

const handleCustomButtons = () => {
  const api = calendarRef.current.getApi()
  api.addEvent({
    title: '新事件',
    start: '2021-01-01',
    end: '2021-01-02',
    allDay: true
  })
}

return (
  <div>
    <button onClick={handleCustomButtons}>自定义prev、next、 today按钮等</button>
    <FullCalendar
      ref={calendarRef}
      plugins={[dayGridPlugin, interactionPlugin]}
      initialView="dayGridMonth"
      headerToolbar={{
        start: 'myPrev,MyNext MyToday myCustomButton',
        center: 'title',
        end: 'dayGridMonth,timeGridWeek,timeGridDay'
      }}
      customButtons={{
        myCustomButton: {
          text: '自定义按钮',
          icon: 'fa fa-plus',
          click: function () {
            alert('自定义按钮被点击了')
          }
        },
        myToday: {
          text: '今天',
          icon: 'fa fa-calendar',
          click: function () {
            alert('今天被点击了')
          }
        },
        myPrev: {
          text: '上个月',
          icon: 'fa fa-chevron-left',
          click: function () {
            alert('上个月被点击了')
          }
        },
        myNext: {
          text: '下个月',
          icon: 'fa fa-chevron-right',
          click: function () {
            alert('下个月被点击了')
          }
        }}
      }}
    />
  </div>
)

8.15 配置 calendarOptions 单元格slotDuration属性

const calendarRef = useRef(null)

return (
  <div>
    <FullCalendar
      ref={calendarRef}
      plugins={[dayGridPlugin, interactionPlugin]}
      initialView="dayGridMonth"
      headerToolbar={{
        start: 'prev,next today',
        center: 'title',
        end: 'dayGridMonth,timeGridWeek,timeGridDay'
      }}
      slotDuration="00:30:00"
    />
  </div>
)

8.16 FullCalendar组件 国际化

const calendarRef = useRef(null)

return (
  <div>
    <FullCalendar
      ref={calendarRef}
      plugins={[dayGridPlugin, interactionPlugin]}
      initialView="dayGridMonth"
      headerToolbar={{
        start: 'prev,next today',
        center: 'title',
        end: 'dayGridMonth,timeGridWeek,timeGridDay'
      }}
      locale="zh-cn"
    />
  </div>
)

8.17 FullCalendar组件 eventDrop事件

const calendarRef = useRef(null)

const handleEventDrop = (info) => {
  console.log(info)
}

const handleEventResize = (info) => {
  console.log(info)
}

const handleEventClick = (info) => {
  console.log(info)
}

return (
  <div>
    <FullCalendar
      ref={calendarRef}
      plugins={[dayGridPlugin, interactionPlugin]}
      initialView="dayGridMonth"
      headerToolbar={{
        start: 'prev,next today',
        center: 'title',
        end: 'dayGridMonth,timeGridWeek,timeGridDay'
      }}
      eventDrop={handleEventDrop}
      eventResize={handleEventResize}
      eventClick={handleEventClick}
    />
  </div>
)

8.18 FullCalendar组件 鼠标事件

const calendarRef = useRef(null)

const handleEventMouseEnter = (info) => {
  console.log(info)
}

const handleEventMouseLeave = (info) => {
  console.log(info)
}

return (
  <div>
    <FullCalendar
      ref={calendarRef}
      plugins={[dayGridPlugin, interactionPlugin]}
      initialView="dayGridMonth"
      headerToolbar={{
        start: 'prev,next today',
        center: 'title',
        end: 'dayGridMonth,timeGridWeek,timeGridDay'
      }}
      eventMouseEnter={handleEventMouseEnter}
      eventMouseLeave={handleEventMouseLeave}
    />
  </div>
)
原文链接:https://code.ifrontend.net/archives/316,转载请注明出处。
0

评论0

显示验证码
没有账号?注册  忘记密码?