vue对FullCalendar的使用

本文将介绍如何在Vue项目中集成并封装全功能的日历组件FullCalendar,从安装到实际应用,帮助开发者实现强大的日程管理功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

安装

		"@fullcalendar/core": "^4.3.1",
        "@fullcalendar/daygrid": "^4.3.0",
        "@fullcalendar/interaction": "^4.3.0",
        "@fullcalendar/timegrid": "^4.3.0",
        "@fullcalendar/vue": "^4.3.1",

封装FullCalendar

<template>
  <div>
    <FullCalendar
      class="demo-app-calendar"
      ref="fullCalendar"
      :allDaySlot="false"
      defaultView="timeGridWeek"
      :minTime="starttime"
      :maxTime="endtime"
      weekNumberTitle="周"
      :height="660"
      :header="{
        left: 'dayGridMonth,timeGridWeek,timeGridDay',
        center: ' title ',
        right: ' prev today next',
      }"
      :eventTimeFormat="{
        hour: '2-digit',
        minute: '2-digit',
        second: '2-digit',
        meridiem: false,
        hour12: false, //设置时间为24小时
      }"
      :slotLabelFormat="{
        hour: '2-digit',
        minute: '2-digit',
        second: '2-digit',
        meridiem: false,
        hour12: false, //设置时间为24小时
      }"
      :buttonText="{
        today: '回到今天',
        month: '月',
        week: '周',
        day: '日',
      }"
      timeFormat="H:mm"
      axisFormat="H:mm"
      :selectable="true"
      eventOrder="order"
      :firstDay="1"
      :displayEventTime="false"
      :displayEventEnd="false"
      :allDayDefault="false"
      locale="zh-cn"
      :weekNumbers="true"
      :customButtons="customButtons"
      :plugins="calendarPlugins"
      :weekends="calendarWeekends"
      :events="calendarEvents"
      @eventRender="eventRenderfn"
      @eventClick="eventClickfn"
    />
  </div>
</template>
<script>
import FullCalendar from "@fullcalendar/vue";
import dayGridPlugin from "@fullcalendar/daygrid";
import timeGridPlugin from "@fullcalendar/timegrid";
import interactionPlugin from "@fullcalendar/interaction";
export default {
  components: {
    FullCalendar, // 像使用自定义组件一样使用
  },
  props: {
    calendarEvents: Array,
    starttime: String,
    endtime: String,
    type: String,
  },
  data() {
    return {
      calendarApi: null, //api
      // 右侧按钮设置
      customButtons: {
        today: {
          text: "回到今天", // 按钮的展示文本
          click: this.todayClick, //方法
        },
        next: {
          click: this.nextClick,
        },
        prev: {
          click: this.prevClick,
        },
      },
      weekNumbers: true, //确定是否应在日历上显示周数。
      calendarPlugins: [dayGridPlugin, timeGridPlugin, interactionPlugin], // 日历里展示的内容插件
      calendarWeekends: true, // 是否在任何日历视图中包含星期六/星期日列。
    };
  },
  // dom渲染完获取dom
  updated() {
    this.$nextTick(() => {
      if (this.type == "course") {
        this.addcolor();
      }
    });
  },
  mounted() {
    this.calendarApi = this.$refs.fullCalendar.getApi();
  },
  methods: {
    // 增加颜色
    addcolor() {
      var riqi = document.querySelector(".fc-button-group");
      var a = document.querySelector(".colorstatus");
      if (!a) {
        var colorstatus = document.createElement("div");
        colorstatus.className = "colorstatus";
        riqi.append(colorstatus);
        colorstatus.innerHTML =
          "<div class='statuitem'><span></span><span>未上课</span></div><div class='statuitem'><span></span><span>教师冲突</span></div><div class='statuitem'><span></span><span>今天</span></div><div class='statuitem'><span></span><span>无学员或学员请假</span></div><div class='statuitem'><span></span><span>已上课或已失效</span></div>";
      }
    },
    // 日历 事件渲染
    eventRenderfn(event) {
      event.el.innerHTML = event.event.title;
    },
    // 点击日期事件
    eventClickfn(event) {
      this.$emit("eventcon", event);
    },
    // 点击回到今日
    todayClick(mouseEvent, htmlElement) {
      this.calendarApi.today(); // 将日历移动到当前日期。
      this.calendarApi.getDate(); // 返回日期的日历的当前日期
      this.getvalue();
    },
    // 获取选择日期的值
    getvalue() {
      var defaultView = this.$refs.fullCalendar.getApi().view.type;
      var title = this.$refs.fullCalendar.getApi().view.title;
      var day = this.$refs.fullCalendar.getApi().view.currentStart;
      var Y = day.getFullYear();
      var M = day.getMonth() + 1;
      var D = day.getDate();
      var value = "";
      if (defaultView == "timeGridWeek") {
        value = this.getWeekYear();
      } else if (defaultView == "dayGridMonth") {
        value = Y + "-" + (M < 10 ? "0" + M : M);
      } else if (defaultView == "timeGridDay") {
        value = Y + "-" + (M < 10 ? "0" + M : M) + "-" + (D < 10 ? "0" + D : D);
      }
      this.$emit("prev", { value, defaultView });
    },
    // 右按钮
    nextClick(mouseEvent, htmlElement) {
      this.calendarApi.next();
      this.getvalue();
    },
    // 左按钮
    prevClick(start, end, timezone, callback) {
      this.calendarApi.prev();
      this.getvalue();
    },
    // 获取一年的第几周
    getWeekYear() {
      var calendarView = this.$refs.fullCalendar.getApi().view;
      var d1 = calendarView.activeEnd;
      var d2 = calendarView.activeStart;
      //下面是获取今年1月号是第几周
      var Y = d1.getFullYear();
      var resDate = Y + "-" + "01" + "-" + "01";
      var W = new Date(Date.parse(resDate)).getDay(); //今年的1月1号周几
      //下面是获取今天是本年第几天
      d2.setMonth(0);
      d2.setDate(1);
      var rq = d1 - d2;
      var s1 = Math.ceil(rq / (24 * 60 * 60 * 1000));

      //(今年的第一天在周数)/7 等于第几周
      var s2 = Math.ceil((s1 + W) / 7);
      return s2 - 1;
    },
  },
};
</script>
<style lang='scss'>
@import "~@fullcalendar/core/main.css";
@import "~@fullcalendar/daygrid/main.css";
@import "~@fullcalendar/timegrid/main.css";
</style>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值