美文网首页
fullcalendar之vue3

fullcalendar之vue3

作者: 秋玄语道 | 来源:发表于2022-12-15 16:30 被阅读0次

    一、创建vue3项目

    1、使用vite创建
    npm init vite@latest
    
    image.png
    2、安装依赖
    npm i @fullcalendar/vue3 //安装vue3版fullcalendar
    npm i @fullcalendar/daygrid 
    npm i @fullcalendar/core
    npm i @fullcalendar/interaction
    npm i @fullcalendar/list
    npm i @fullcalendar/timegrid
    

    二、代码块

    1、在src/data/event-utils.ts
    import { EventInput } from '@fullcalendar/core'
    
    let eventGuid = 0
    let todayStr = new Date().toISOString().replace(/T.*$/, '') // YYYY-MM-DD of today
    
    export const INITIAL_EVENTS: EventInput[] = [
      {
        id: createEventId(),
        title: 'All-day event',
        start: todayStr
      },
      {
        id: createEventId(),
        title: 'Timed event',
        start: todayStr + 'T12:00:00'
      }
    ]
    
    export function createEventId() {
      return String(eventGuid++)
    }
    
    
    2、在src/App.vue
    <script setup lang="ts">
    import FullCalendar from './components/fullcanlendar.vue'
    </script>
    
    <template>
      <FullCalendar msg="Vite + Vue" />
    </template>
    
    3、在src/App.vue
    <script setup lang="ts">
    import FullCalendar from './components/Fullcanlendar.vue'
    </script>
    
    <template>
      <FullCalendar msg="Vite + Vue" />
    </template>
    
    4、在src/components/Fullcanlendar.vue
    <script lang='ts'>
    import { defineComponent } from 'vue'
    import { CalendarOptions, EventApi, DateSelectArg, EventClickArg } from '@fullcalendar/core'
    import FullCalendar from '@fullcalendar/vue3'
    import dayGridPlugin from '@fullcalendar/daygrid'
    import timeGridPlugin from '@fullcalendar/timegrid'
    import interactionPlugin from '@fullcalendar/interaction'
    import { INITIAL_EVENTS, createEventId } from '../data/event-utils'
    
    export default defineComponent({
      components: {
        FullCalendar,
      },
      data() {
        return {
          calendarOptions: {
            plugins: [
              dayGridPlugin,
              timeGridPlugin,
              interactionPlugin // needed for dateClick
            ],
            headerToolbar: {
              left: 'prev,next today',
              center: 'title',
              right: 'dayGridMonth,timeGridWeek,timeGridDay'
            },
            initialView: 'dayGridMonth',
            initialEvents: INITIAL_EVENTS, // alternatively, use the `events` setting to fetch from a feed
            editable: true,
            selectable: true,
            selectMirror: true,
            dayMaxEvents: true,
            weekends: true,
            select: this.handleDateSelect,
            eventClick: this.handleEventClick,
            eventsSet: this.handleEvents
            /* you can update a remote database when these fire:
            eventAdd:
            eventChange:
            eventRemove:
            */
          } as CalendarOptions,
          currentEvents: [] as EventApi[],
        }
      },
      methods: {
        handleWeekendsToggle() {
          this.calendarOptions.weekends = !this.calendarOptions.weekends // update a property
        },
        handleDateSelect(selectInfo: DateSelectArg) {
          let title = prompt('Please enter a new title for your event')
          let calendarApi = selectInfo.view.calendar
    
          calendarApi.unselect() // clear date selection
    
          if (title) {
            calendarApi.addEvent({
              id: createEventId(),
              title,
              start: selectInfo.startStr,
              end: selectInfo.endStr,
              allDay: selectInfo.allDay
            })
          }
        },
        handleEventClick(clickInfo: EventClickArg) {
          if (confirm(`Are you sure you want to delete the event '${clickInfo.event.title}'`)) {
            clickInfo.event.remove()
          }
        },
        handleEvents(events: EventApi[]) {
          this.currentEvents = events
        },
      }
    })
    
    </script>
    
    <template>
      <div class='demo-app'>
        <div class='demo-app-sidebar'>
          <div class='demo-app-sidebar-section'>
            <h2>Instructions</h2>
            <ul>
              <li>Select dates and you will be prompted to create a new event</li>
              <li>Drag, drop, and resize events</li>
              <li>Click an event to delete it</li>
            </ul>
          </div>
          <div class='demo-app-sidebar-section'>
            <label>
              <input
                type='checkbox'
                :checked='calendarOptions.weekends'
                @change='handleWeekendsToggle'
              />
              toggle weekends
            </label>
          </div>
          <div class='demo-app-sidebar-section'>
            <h2>All Events ({{ currentEvents.length }})</h2>
            <ul>
              <li v-for='event in currentEvents' :key='event.id'>
                <b>{{ event.startStr }}</b>
                <i>{{ event.title }}</i>
              </li>
            </ul>
          </div>
        </div>
        <div class='demo-app-main'>
          <FullCalendar
            class='demo-app-calendar'
            :options='calendarOptions'
          >
            <template v-slot:eventContent='arg'>
              <b>{{ arg.timeText }}</b>
              <i>{{ arg.event.title }}</i>
            </template>
          </FullCalendar>
        </div>
      </div>
    </template>
    
    <style lang='css'>
    
    h2 {
      margin: 0;
      font-size: 16px;
    }
    
    ul {
      margin: 0;
      padding: 0 0 0 1.5em;
    }
    
    li {
      margin: 1.5em 0;
      padding: 0;
    }
    
    b { /* used for event dates/times */
      margin-right: 3px;
    }
    
    .demo-app {
      display: flex;
      min-height: 100%;
      font-family: Arial, Helvetica Neue, Helvetica, sans-serif;
      font-size: 14px;
    }
    
    .demo-app-sidebar {
      width: 300px;
      line-height: 1.5;
      background: #eaf9ff;
      border-right: 1px solid #d3e2e8;
    }
    
    .demo-app-sidebar-section {
      padding: 2em;
    }
    
    .demo-app-main {
      flex-grow: 1;
      padding: 3em;
    }
    
    .fc { /* the calendar root */
      max-width: 1100px;
      margin: 0 auto;
    }
    
    </style>
    
    

    三、运行项目

    npm run dev
    
    image.png

    相关文章

      网友评论

          本文标题:fullcalendar之vue3

          本文链接:https://www.haomeiwen.com/subject/muerqdtx.html