Vue项目使用

<template><div class="M_container"><FullCalendarclass="fullcalendar"ref="myCalendar":options="calendarOptions"></FullCalendar></div>
</template><script>import { GetDayList } from "@/api/schedule/index";
import {formateDate} from "@/utils/schedule/formate";
import FullCalendar from "@fullcalendar/vue";
import dayGridPlugin from "@fullcalendar/daygrid";
import timeGridPlugin from "@fullcalendar/timegrid";
import interactionPlugin from "@fullcalendar/interaction";
import {eventContetFun,changeStartEnd,slotLabelContent,eventMouseEnter} from "@/utils/schedule/fullcalendarHandler"
export default {name: "byDay",components: {FullCalendar},props:['filterDate'],data() {return {selectDate:'',calendarOptions: {plugins: [dayGridPlugin, interactionPlugin, timeGridPlugin],initialView: "timeGridDay",events: [],locale: "zh-cn", themeSystem: "bootstrap", // 主题色(本地测试未能生效)expandRows: true,expandRows: true,contentHeight: 870,timeGridEventMinHeight: "26", // 设置事件的最小高度// 设置日历单元格宽度与高度的比例。eventLimit: true, // 设置月日程,与all-day slot的最大显示数量,超过的通过弹窗显示headerToolbar: false,allDaySlot: true,allDayText: "全天",scrollTimeReset:true,scrollTime:"12:00:00",slotDuration:"01:00",slotMinTime: "07:00:00",slotMaxTime: "20:00:00",dayHeaders: false,slotEventOverlap: false,//是否重叠showNonCurrentDates: false,eventMouseEnter:eventMouseEnter,slotLabelContent:slotLabelContent,eventContent:eventContetFun, views: {timeGridDay: {eventLimit:5,dayMaxEventRows: 4, /*  eventMaxStack:30, */moreLinkContent: "更多",moreLinkClick: "popover",},},slotLabelFormat: {hour: "2-digit",minute: "2-digit",meridiem: false,hour12: false, // 设置时间为24小时},eventLimitNum: {// 事件显示数量限制(本地测试未能生效)dayGrid: {eventLimit: 3,},timeGrid: {eventLimit: 2, // adjust to 6 only for timeGridWeek/timeGridDay},},eventClick: this.handleEventClick,},};},watch: {filterDate: {handler(newValue,oldValue) {if(newValue&&newValue!=oldValue){ /*  this.$emit('changeDayDate',newValue); */this.selectDate=newValue;this.getDayData();}else{this.$alert("请选择日期", "提示");}},immediate: true},},mounted() {this.$nextTick(()=>{this.selectDate=this.filterDate;})},methods: {changeSelect(){this.$emit('changeDayDate',this.selectDate);},getDayData() {const _this = this;this.$nextTick(()=>{let calendarApi = this.$refs.myCalendar.getApi(); calendarApi.gotoDate( _this.filterDate );})GetDayList({startDate: _this.filterDate,}).then((res) => {let resData = res.data,result = resData.flat(Infinity);const handleData = result.map((item) => {let timeObj=changeStartEnd(_this.filterDate,item); return {start: timeObj.itemStart,end: timeObj.itemEnd,startTimes:new Date(item.startTime?item.startTime:item.allDayStartTime),endTimes:new Date(item.endTime?item.endTime:item.allDayEndTime),title: item.sysScheduleContent,classNames: item.actualCompleteTime ? "blue" : "orange",sysScheduleArrangeAllRecordId:item.sysScheduleArrangeAllRecordId,sysScheduleArrangeId:item.sysScheduleArrangeId,status:item.status,actualCompleteTime:item.actualCompleteTime,important:item.important,};});_this.calendarOptions.events =handleData;});},/*** 点击日历日程事件** info: 事件信息* event是日程(事件)对象* jsEvent是个javascript事件* view是当前视图对象。*/handleEventClick(info) {const data=info.event._def.extendedProps;const scheduleID={sysScheduleArrangeAllRecordId:data.sysScheduleArrangeAllRecordId,sysScheduleArrangeId:data.sysScheduleArrangeId,status:data.status};this.$emit('getScheduleID',scheduleID)},},
};
</script>

依赖包版本如下

页面效果:

纵坐标时间轴处理:

首先,设置

slotMinTime: "07:00:00",

slotMaxTime: "20:00:00",

设置后08:00-18:00前后只剩下一格位置,再结合slotLabelContent:function(arg){}对时间轴文字处理

function slotLabelContent(arg){if (Number(arg.time.milliseconds) < 28800000) {return "08:00前";}if (Number(arg.time.milliseconds) >= 28800000 &&Number(arg.time.milliseconds) <= 64800000) {return arg.text;}if (Number(arg.time.milliseconds) > 64800000) {return "19:00后";}
}

这下出现了20:00后或者07:00前的数据无法呈现,因为该部分时间并没有对应的时间轴

这时候就要对Events:[]的数据进行处理,同时结合eventContent:function(arg){}

以下代码是对start和end进行处理

function changeStartEnd(day, item) {if(item.startTime&&item.endTime){//非全天let startTime = new Date(day + " " + '08:00');let endTime = new Date(day + " " + '20:00');let endTime1 = new Date(day + " " + '19:00');let itemStart = new Date(item.startTime);let itemEnd = new Date(item.endTime);if (itemStart < startTime) {itemStart = new Date(day + " " + '07:00');}if (itemStart > endTime1) {itemStart = new Date(day + " " + '19:00')}if (itemEnd < startTime) {itemEnd = startTime;}if (itemEnd > endTime1) {itemEnd = endTime;}if(new Date(itemEnd)-new Date(itemStart)==0){//开始时间和结束时间一样 只占用半格let Hour=itemStart.getHours()<10?'0'+itemStart.getHours():itemStart.getHours()let time=itemStart.getFullYear()+"-"+(itemStart.getMonth()+1)+"-"+itemStart.getDate()+" "+HouritemStart=time+":00";itemEnd=time+":30"}return {itemEnd,itemStart}}else{//全天日程return {itemStart:item.allDayStartTime,itemEnd: item.allDayEndTime}}}

startTimes和endTimes用于页面文字展示时间段

fullcalendar插槽的使用

1.自定义dayHeaderContent

<FullCalendarref="fullCalendar"class="fullcalendar week":options="calendarOptions"><template v-slot:dayHeaderContent='arg'><div class="top"  @click="changeToDay(arg.date)">{{arg|formateHeaderContent}}<span v-if="weekEventNumObj[arg.dow]>1" class="moreTips">更多日程</span></div></template> </FullCalendar>

2.自定义eventContent

<template v-slot:eventContent='arg'><el-tooltipclass="box-item"effect="dark"placement="top-start"><template #content><span>{{ parseTime(arg.event.start,'{m}月{d}日 {h}:{i}') }}-{{ parseTime(arg.event.end,'{m}月{d}日 {h}:{i}') }} 预约时长:{{arg.event.extendedProps.num}}小时</span></template><div :class="[type !='check' ? 'text-box':'text-box check']"><span @click="changeInfo(arg.event)">{{ parseTime(arg.event.start,'{m}月{d}日') == parseTime(arg.event.end,'{m}月{d}日') ? parseTime(arg.event.start,'{h}:{i}') : parseTime(arg.event.start,'{m}月{d}日 {h}:{i}') }} -{{ parseTime(arg.event.end,'{m}月{d}日') == parseTime(arg.event.start,'{m}月{d}日') ? parseTime(arg.event.end,'{h}:{i}') : parseTime(arg.event.end,'{m}月{d}日 {h}:{i}')}}时长:{{arg.event.extendedProps.num}}h</span><el-button v-if="type !='check'" type="danger" circle @click="deleteItem(arg.event.id)"><el-icon size="10"><close-bold /></el-icon></el-button></div></el-tooltip>
</template>
<template v-slot:eventContent="arg"><el-popover:append-to-body="true"ref="popover1"placement="top-start"width="220":visible-arrow="true"trigger="hover":teleported="false"popper-class="popover":open-delay="100"@show="showPic(arg)"@hide="popoverPicReset(arg)"></el-popover>
</template>

3.自定义slotLabelContent

tips:  slotDuration:"01:00",设置为一个小时,时间垂直居中显示,不然偏上

<FullCalendarref="fullCalendar"class="fullcalendar week":options="calendarOptions"><template v-slot:slotLabelContent='arg'><div class="top"  @click="changeToDay(arg.date)">{{arg|formateHeaderContent}}<span v-if="weekEventNumObj[arg.dow]>1" class="moreTips">更多日程</span></div></template> </FullCalendar>

Fullcalendar V5踩坑 (日视图篇)相关推荐

  1. 环信SDK 踩坑记webIM篇(三)

    问题:接收消息时报错 TypeError: Cannot read property 'isemoji' of undefined at connection.handleMessage 自己打开了w ...

  2. 环信SDK 踩坑记webIM篇(二)

    发送消息时报错Converting circular structure to JSON 这句话我也在网上查了一下,导致的原因可能是里面存在多级递归,导致JSON很大,不能使用.这是为什么呢,请看代码 ...

  3. 环信SDK 踩坑记webIM篇(一)

    (一)处理添加好友 问题:添加好友时,一直返回none,就是对方拒绝添加的意思,可是在代码里明明就是有同意添加 的代码: onPresence: function (message) {switch ...

  4. python3爬虫踩坑记纪录篇(二)

    1首先这两天遇到线程锁的问题不涉及锁机制,只改代码 线程锁的时候一定要锁上全局变量,局部变量或没锁的情况都会造成程序重复 同时lock.acquire(),lock.release()可以使用with ...

  5. 踩坑日记第一篇:nacos作为配置中心加载带加密的数据库连接配置文件时出现报错claims to not accept jdbcUrl, mpw...

    在项目中采用了AES加密和ENC加密方式的项目,在配置中心加载配置文件的时候使用AES加密是无法启动的,全部改用 ENC的加密方式

  6. vantUI组件:van-card 自定义内容 - 踩坑篇

    vantUI组件:van-card 自定义内容 - 踩坑篇 特别说明: 自定义用法,格式必须: <van-card> <template #tags> ····自定义内容·· ...

  7. vantUI组件:获取验证码 - 踩坑篇

    vant 的button组件:(发送验证码)按钮点击没反应? 应用场景 · 前戏: 效果图解说: 代码公示: <van-fieldv-model="sms"centercle ...

  8. vantUI 弹出层(轻提示)案例 - 踩坑篇

    vantUI 弹出层(轻提示)- 踩坑篇 可自定义项: 显示时长 显示内容 显示何时消失 代码 · 实例: if(this.checkedAgreement == false){this.$toast

  9. 原生Javascript 操作 css类名 - 踩坑篇

    文章目录 原生Javascript 操作 css类名 效果图示下: 案例 · 代码如下: 重要代码提示: 其他无关参考: 官方参考: 原生Javascript 操作 css类名 不建议用 .class ...

最新文章

  1. php swoole编译,编译安装swoole1.7.9,PHP版本5.6.5
  2. java类定义的顺序_Java类及对象的初始化顺序
  3. 机器学习知识点(二十四)隐马尔可夫模型HMM维特比Viterbi算法Java实现
  4. php 输出excepion内容,带有消息“无法关闭zip文件php://输出”的PHPExcel_Writer_Exception...
  5. 牛客网-剑指offer 第一题(二维数组中的查找)
  6. python gis库_使用开放的python库自动化GIS和遥感工作流
  7. securecrt使用_SecureCRT会话丢失原因及解决方法
  8. SAP License:我应该怎么学习SAP?
  9. 批量获取ip运营商_通信公司员工收钱开通IP多拨被用于诈骗,6人获刑
  10. php整数和浮点数比较,php 浮点数怎么进行比较?
  11. 为什么这本书大家都称好
  12. textarea 在 Chrome Safari FireFox 浏览器中禁用拖动和固定大小
  13. 分割线怎么搭建css,css怎么设置分割线
  14. 住宅IP代理和数据中心IP代理有什么区别?
  15. Linux查看服务器SN序列码
  16. 脑洞大开的思维工具:六顶思考帽
  17. 春节感悟 - 快递延误的售后问题
  18. 【CSS3】变形--位移 translate()
  19. openwrt c语言配置文件,OpenWrt学习笔记7 -- 让人类重建巴别塔的UCI之UCI配置文件
  20. cocos2d-x分享系统

热门文章

  1. 关于2013.12大数据课题的计划
  2. 解决SQL Server 导入System.Web.dll程序集,报错问题
  3. LabVIEW利用闭回路控制开发自动化麻醉系统
  4. 破解企业服务支付难题,SaaS与支付如何深度融合?
  5. HTTP(Request)
  6. php 如何去掉换行符,php如何去掉换行符
  7. 期权基本交易策略(二)
  8. POLYV AI 打造视频直播“最强大脑”
  9. Canal的理解与应用
  10. OFDM同步技术基于MATLAB仿真,基于Matlab的OFDM系统仿真