FullCalendar v5:如何仅按SkillPriority分组事件不受时间影响?
解决FullCalendar v5中仅按自定义字段排序事件(忽略时间/时长)的问题
我明白你遇到的困扰了——你希望同一资源下的事件完全按照SkillPriority垂直分组排序,但默认设置eventOrder={['SkillPriority']}后,事件的开始时间和时长还是会干扰排序结果,导致不同优先级的事件混杂在一起。这其实是因为FullCalendar的默认排序逻辑里,时间相关字段(start/end)的优先级高于你指定的自定义字段,哪怕你显式设置了eventOrder数组,它也只是把自定义字段作为次要排序条件,而不是唯一依据。
解决方案:使用自定义eventOrder排序函数
要完全忽略时间因素,只按SkillPriority排序,你需要替换数组形式的eventOrder为自定义排序函数,直接控制事件的排序规则:
// 替换原来的eventOrder={['SkillPriority']}为以下函数 eventOrder: (eventA, eventB) => { // 将SkillPriority转为数字,避免字符串比较的问题(比如'10'会比'2'小) const priorityA = parseInt(eventA.SkillPriority, 10); const priorityB = parseInt(eventB.SkillPriority, 10); // 按优先级升序排列:SkillPriority=1的事件排在前面,=2的在后面 // 如果想反过来降序,就返回 priorityB - priorityA return priorityA - priorityB; }
为什么这个方法有效?
当你使用函数形式的eventOrder时,FullCalendar会完全遵循你定义的比较逻辑,不再默认混入时间排序。上面的函数直接比较两个事件的SkillPriority数值,返回差值来决定顺序,完全忽略了事件的开始时间、结束时间或时长。
可选:相同优先级下的次要排序
如果需要对相同SkillPriority的事件设置次要排序规则(比如按开始时间排序),可以在函数里添加额外判断:
eventOrder: (eventA, eventB) => { const priorityA = parseInt(eventA.SkillPriority, 10); const priorityB = parseInt(eventB.SkillPriority, 10); if (priorityA === priorityB) { // 相同优先级时,按开始时间升序排列 return new Date(eventA.start) - new Date(eventB.start); } return priorityA - priorityB; }
关于你的资源配置
你的resourceOrder={['unitPriority', 'areaPriority']}设置是正确的,它控制的是资源(Unit和Area)的排序顺序,和事件排序无关,不需要修改。
这样调整后,同一资源下的事件就会严格按照SkillPriority分组排列,不会再因为时间或时长的差异而混杂了。
内容的提问来源于stack exchange,提问作者Victor
相关产品推荐
相关产品推荐

