FullCalendar的使用,react日历组件

1.下载

yarn add @fullcalendar/core @fullcalendar/react @fullcalendar/daygrid

2.运行

import React from 'react';
import FullCalendar from "@fullcalendar/react";
import dayGridPlugin from "@fullcalendar/daygrid";

const ExperimentalSchedule = () => {

  return (
    <>
          <FullCalendar
          defaultView="dayGridMonth"
          plugins={[dayGridPlugin]}
        />
    </>
  );
};

export default ExperimentalSchedule;

3.右上角需要,日周月

yarn add @fullcalendar/timegrid

 <FullCalendar
          defaultView="dayGridMonth"
          plugins={[dayGridPlugin, timeGridPlugin]}
          headerToolbar={{
            left: "prevYear,prev,next,nextYear today", // 上一年,上一月,下一月,下一年 今天
            center: "title", // 当前年月
            right: "timeGridDay,timeGridWeek,dayGridMonth" // 天 周 月
          }}
        />

4.汉化,locale='zh-cn'

 <FullCalendar
          defaultView="dayGridMonth"
          plugins={[dayGridPlugin, timeGridPlugin]}
          headerToolbar={{
            left: "prevYear,prev,next,nextYear today", // 上一年,上一月,下一月,下一年 今天
            center: "title", // 当前年月
            right: "timeGridDay,timeGridWeek,dayGridMonth" // 天 周 月
          }}
          locale='zh-cn'
          buttonText={{
            today: '今天',
            month: '月',
            week: '周',
            day: '天'
          }}
          allDayText='全天'
        />

5.修改,周一开头,时间修改为24小时制

 <FullCalendar
          defaultView="dayGridMonth"
          plugins={[dayGridPlugin, timeGridPlugin]}
          headerToolbar={{
            left: "prevYear,prev,next,nextYear today", // 上一年,上一月,下一月,下一年 今天
            center: "title", // 当前年月
            right: "timeGridDay,timeGridWeek,dayGridMonth" // 天 周 月
          }}
          locale='zh-cn'
          buttonText={{
            today: '今天',
            month: '月',
            week: '周',
            day: '天'
          }}
          allDayText='全天'
          firstDay={1} // 周一至周六为1~6,周日为0,喜欢周几开始就填几
          slotLabelFormat={{
            hour: '2-digit',
            minute: '2-digit',
            meridiem: false,
            hour12: false
          }}
        />

6.创建循环任务和单独任务

import React, { useEffect, useState } from 'react';
import FullCalendar from "@fullcalendar/react";
import dayGridPlugin from "@fullcalendar/daygrid";
import timeGridPlugin from "@fullcalendar/timegrid";


const ExperimentalSchedule = () => {
  let matchList = [
    {
      id: '1',
      name: '第一个任务',
      startTime: "2024-07-09 13:22:05",
      endTime: "2024-07-09 15:38:05",
      repeatExecute: false,
    },
    {
      id: '2',
      name: '第二个任务',
      startTime: "2024-07-13 09:45:23",
      endTime: "2024-07-13 15:10:23",
      repeatExecute: false,
    },
    {
      id: '3',
      name: '第三个任务',
      startTime: "2024-07-20 19:37:18",
      endTime: "2024-07-20 19:43:18",
      repeatExecute: false,
    },
    {
      id: '4',
      name: '第四个任务',
      startTime: "2024-07-25 14:49:05",
      endTime: "2024-07-25 03:15:05",
      repeatExecute: false,
    },
  ];

  let repeatMatchList = [
    {
      id: '5',
      name: '每周一,周三重复任务',
      startDate: "2024-07-09", // 任务创建于12月10日
      startTime: "09:10:00", // 每次任务的开始时间
      endTime: "17:30:23", // 每次任务的结束时间
      repeatDates: ["星期一", "星期三"],
      repeatExecute: true,
    },
    {
      id: '6',
      name: '每周二重复任务',
      startDate: "2024-07-09", // 任务创建于12月2日
      startTime: "15:10:00", // 每次任务的开始时间
      endTime: "17:30:23", // 每次任务的结束时间
      repeatDates: ["星期二"],
      repeatExecute: true,
    }
  ];
  const formartRepeat = (value) => {
    switch (value) {
      case '星期一':
        value = 1;
        break;
      case '星期二':
        value = 2;
        break;
      case '星期三':
        value = 3;
        break;
      case '星期四':
        value = 4;
        break;
      case '星期五':
        value = 5;
        break;
      case '星期六':
        value = 6;
        break;
      case '星期日':
        value = 0;
        break;
    }
    return value;
  }
  const [events, setEvents] = useState([]);
  useEffect(() => {
    // 准备事件数据
    const preparedEvents = (list) => {
      return list.map(({ id, name, startTime, endTime, repeatExecute, repeatDates, startDate }) => {
        let event = {
          id,
          title: name,
          start: repeatExecute ? `${startDate}T${startTime}` : startTime, // 格式化时间
          end: repeatExecute ? `${startDate}T${endTime}` : endTime, // 格式化时间
          borderColor: repeatExecute ? 'black' : 'red',
        };

        if (repeatExecute) {
          event.daysOfWeek = repeatDates.map(formartRepeat); // 设置星期几重复
          event.startRecur = startDate; // 重复开始日期
        }

        return event;
      });
    };

    const formattedEvents = [...preparedEvents(matchList), ...preparedEvents(repeatMatchList)];
    setEvents(formattedEvents);
  }, []);
  const  eventClick = (eventInfo) => {
    console.log(eventInfo.event);
  }
  return (
    <>
 <FullCalendar
          defaultView="dayGridMonth"
          plugins={[dayGridPlugin, timeGridPlugin]}
          headerToolbar={{
            left: "prevYear,prev,next,nextYear today", // 上一年,上一月,下一月,下一年 今天
            center: "title", // 当前年月
            right: "timeGridDay,timeGridWeek,dayGridMonth" // 天 周 月
          }}
          locale='zh-cn'
          buttonText={{
            today: '今天',
            month: '月',
            week: '周',
            day: '天'
          }}
          allDayText='全天'
          firstDay={1} // 周一至周六为1~6,周日为0,喜欢周几开始就填几
          slotLabelFormat={{
            hour: '2-digit',
            minute: '2-digit',
            meridiem: false,
            hour12: false
          }}
          events={events}
          eventClick={eventClick}
        />
    </>
  );
};

export default ExperimentalSchedule;

7.如果想让月视图的任务既显示开始时间又显示结束时间,加一个属性:

displayEventEnd

8.用后端数据

  const [matchList,setMatchList] = useState([]);
  const [repeatMatchList,setRepeatMatchList] = useState([]);
  useEffect(() => {
    const init=async()=>{
      const res= await scheduleService.getScheduleList()
    // console.log(res.data);
      setMatchList(res.data)
    }
    init()
  }, []);
  const preparedEvents = (list) => {
    return list.map(({ experimentName, startTime, endTime, id, remindTime }) => {
      let event = {
        id: id,
        title: experimentName, // 事件标题使用实验名称
        start: startTime, // 格式化时间
        end: endTime, // 格式化时间
        // 假设 borderColor 根据 remindTime 的值来设置颜色
        borderColor: 'red',
      };
      // 如果有 remindTime 并且需要设置重复提醒,则进行相应的设置
      if (remindTime) {
        // 这里可以添加重复事件的逻辑,例如根据 remindTime 设置重复提醒的规则
        // 例如:event.daysOfWeek = ...;
        // event.startRecur = remindTime;
      }
      return event;
    });
  }
  useEffect(() => {
    const formattedEvents = [...preparedEvents(matchList), ...preparedEvents(repeatMatchList)];
    setEvents(formattedEvents);
  }, [matchList]);

9.日程的点击事件

  const eventClick = async(eventInfo) => {
    const id=eventInfo.event._def.publicId
    setscheduleId(eventInfo.event._def.publicId)
    console.log(eventInfo.event);
      setModalVisit1(true)
    const res=await scheduleService.getScheduleById(id)
    // console.log(res.data);
      form1.setFieldsValue(res.data)
  };
    eventClick={eventClick}

10.自定义按钮

customButtons={{
          jia: {
            text: '添加日程',
            click: function () {
              setModalVisit(true);
            },
          },
        }}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/796946.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ROS1 DWB 与 ROS2 DWA 比较

“DWA算法(dynamic window approach)是移动机器人在运动模型下推算(v,w)对应的轨迹,确定速度采样空间或者说是动态窗口(三种限制);在速度空间(v,w)中采样多组速度,并模拟这些速度在一定时间内的运动轨迹,通过一个评价函数对这些轨迹打分,选取最优的轨迹来驱动机器人运动”。ROS…

PHP计件工资系统小程序源码

解锁高效管理新姿势&#xff01;全面了解计件工资系统 &#x1f525; 开篇&#xff1a;为什么计件工资系统成为企业新宠&#xff1f; 在这个效率至上的时代&#xff0c;企业如何精准激励员工&#xff0c;提升生产力成为了一大挑战。计件工资系统应运而生&#xff0c;它以其公…

【UE5.1 角色练习】15-枪械射击——子弹发射物

目录 效果 步骤 一、创建并发射子弹 二、优化子弹 效果 步骤 一、创建并发射子弹 1. 在前面的文章中&#xff08;【UE5.1 角色练习】06-角色发射火球-part1&#xff09;我们创建了蓝图“BP_Skill_FireBall” 这里我们复制一份命名为“BP_Ammo_5mm”&#xff0c;用于表示…

【算法】单调队列

一、什么是单调队列 单调队列是一种数据结构&#xff0c;其特点是队列中的元素始终保持单调递增或递减&#xff0c;主要用于维护队列中的最小值或最大值。 不同于普通队列只能从队头出队、队尾入队&#xff0c;单调队列为了维护其特征&#xff0c;还允许从队尾出队 不管怎么…

【每日一练】python之sum()求和函数实例讲解

在Python中&#xff0c; sum()是一个内置函数&#xff0c;用于计算可迭代对象&#xff08;如列表、元组等&#xff09;中所有元素的总和。如下实例&#xff1a; """ 收入支出统计小程序 知识点:用户输入获取列表元素添加sum()函数&#xff0c;统计作用 "&…

我的六天C++外出学习记

第一天 7月7日 星期日 早晨&#xff0c;我早早起来了&#xff0c;穿好衣服吃完饭就出发了。 我从家到学校用了1H&#xff0c;迟到了&#xff01;我急急忙忙去报到。 我们中午和晚上的饭菜虽说有点贵&#xff0c;但实在太美味了&#xff0c;和我们原本初中的饭菜相比&#…

计算机视觉领域的基础模型

参考&#xff1a;计算机视觉领域的基础模型 (qq.com) 注意&#xff1a;本文只做笔记&#xff0c;不做搬运 将CV&#xff08;Computer Vision&#xff09;分为四类&#xff1a; 传统模型&#xff1a;只有图像输入&#xff0c;使用Transformer架构和自监督学习方法。文本提示模…

力扣-排序算法

排序算法&#xff0c;一般都可以使用std&#xff1a;&#xff1a;sort&#xff08;&#xff09;来快速排序。 这里介绍一些相关的算法&#xff0c;巩固记忆。 快速排序 跟二分查找有一丢丢像。 首先选择一个基准元素&#xff0c;一般就直接选择第一个。然后两个指针&#xff0c…

Spring的AOP进阶。(AOP的通知类型、通知顺序、切入点表达式和连接点。)

3. AOP进阶 AOP的基础知识学习完之后&#xff0c;下面我们对AOP当中的各个细节进行详细的学习。主要分为4个部分&#xff1a; 通知类型通知顺序切入点表达式连接点 我们先来学习第一部分通知类型。 3.1 通知类型 在入门程序当中&#xff0c;我们已经使用了一种功能最为强大…

QT creator与VS2019 QT加载模块方法

QT creator与VS2019加载模块方法 QT creator&#xff0c;pro文件添加 VS2019 QT

c语言指针超详解——入门篇

文章目录 前言1. 内存与地址内存编址 2. 指针变量和地址取地址操作符 &指针变量和解引用操作符 *指针变量解引用操作符指针变量的大小 3. 指针变量类型的意义指针的解引用指针-整数void* 指针 4. const 修饰指针const 修饰指针指向的变量const 修饰指针变量 5. 指针运算指针…

家具展示预约小程序对线上生意有什么用

沙发、茶几、衣柜等各种家具用品是每个家庭必备的&#xff0c;尤其是新房更需要&#xff0c;且在客户消费能力方面通常预算也比较足&#xff0c;市场中大小品牌比较多&#xff0c;以商场店、独立门店、线上电商平台经营为主。 在实际经营中&#xff0c;厂商和经销商都需要找到…

浪潮天启防火墙TQ2000远程配置方法SSL-V偏、L2xx 配置方法

前言 本次设置只针对配置V偏&#xff0c;其他防火墙配置不涉及。建议把防火墙内外网都调通后再进行V偏配置。 其他配置可参考&#xff1a;浪潮天启防火墙配置手册 配置SSLVxx 在外网端口开启SSLVxx信息 开启SSLVxx功能 1、勾选 “启用SSL-Vxx” 2、设置登录端口号&#xff0…

linux宝塔负载状态100%解决办法

宝塔面板负载状态显示100% 接着使用top命令查看了一下&#xff0c;发现cpu利用率很低&#xff0c;load却很高 通过使用 ps -axjf命令查看是否存在D状态进程 D 状态是指不可中断的睡眠状态&#xff0c;该状态的进程无法被 kill&#xff0c;也无法自行退出&#xff0c;只能通过恢…

Zabbix配置JAVA JMX监控

JAVA JMX监控简介 官方文档&#xff1a;https://www.zabbix.com/documentation/current/zh/manual/concepts/java Zabbix Java gateway以 Zabbix 守护进程方式原生支持监控 JMX 应用程序。Zabbix Java gateway 的守护进程是用 Java 编写。为了在特定主机上找到 JMX 计数器的值…

【JavaScript】解决 JavaScript 语言报错:Uncaught TypeError: XYZ is not a function

文章目录 一、背景介绍常见场景 二、报错信息解析三、常见原因分析1. 变量或对象属性类型错误2. 函数名拼写错误或覆盖3. 作用域问题导致的函数未定义4. 调用未初始化的函数 四、解决方案与预防措施1. 确保变量类型正确2. 检查拼写错误3. 注意作用域4. 初始化变量 五、示例代码…

OrangePi AIpro 浅上手及AI体验

前言 很高兴&#xff0c;收到了一份新款 OrangePi AIpro 开发板&#xff0c;这是香橙派第一次与华为昇腾合作&#xff0c;使用昇腾系列 AI 处理器来设计这款高性价比的 AI 开发板。这块开发板不仅性能强大&#xff0c;还支持丰富的硬件接口&#xff0c;为AI开发者提供了一个理…

BI佐罗,居然抄袭洗稿我的文章

必须曝光此博主不当行径。 4月2日这天发表的原创文章&#xff1a;BI报表系统建设10大坑&#xff0c;因为都是切身的实际项目经验总结&#xff0c;获得了很多人的关注。 我觉得写文章要写的是亲身、真的做过的专业的项目经验&#xff0c;而不是信口开河随口忽悠。 如果有些博…

新手-前端生态

文章目录 新手的前端生态一、概念的理解1、脚手架2、组件 二、基础知识1、HTML2、css3、JavaScript 三、主流框架vue3框架 四、 工具&#xff08;特定框架&#xff09;1、uinapp 五、组件库&#xff08;&#xff09;1、uView如何在哪项目中导入uView 六、应用&#xff08;各种应…

240712_昇思学习打卡-Day24-LSTM+CRF序列标注(3)

240712_昇思学习打卡-Day24-LSTMCRF序列标注&#xff08;3&#xff09; 今天做LSTMCRF序列标注第三部分&#xff0c;同样&#xff0c;仅作简单记录及注释&#xff0c;最近确实太忙了。 Viterbi算法 在完成前向训练部分后&#xff0c;需要实现解码部分。这里我们选择适合求解…