在Angular中开发支持单天时段拖拽设置的日程表功能咨询
Angular 周视图日程表时段选择功能开发思路
基础网格结构搭建
- 采用CSS Grid实现二维时间网格布局:横轴为周一至周日7列,纵轴按你需要的时间粒度(15分钟/30分钟/1小时)拆分单元格,每个单元格对应
指定周内日期+指定时段的唯一维度,和你贴的示例图结构完全匹配 - 用Angular的
@for语法批量渲染单元格,每个单元格绑定自定义属性data-weekday(存储周几的索引,0-6)、data-time-index(存储时段的索引,比如0代表0点、1代表1点),同时绑定唯一ID方便状态管理 - 用二维数组或者
Set<string>结构存储选中的单元格ID,命名格式可以用{weekdayIndex}_{timeIndex},查询和修改效率都很高
点击单选功能实现
- 给所有单元格绑定
click事件,点击时读取当前单元格的两个自定义属性,拼接成ID后更新选中状态集合,同步给选中的单元格加selected类实现高亮效果 - 如果需要区分工作/休息/禁用等不同时段类型,可以把状态集合改成Map结构,key存单元格ID,value存对应的时段类型,渲染时根据类型加不同的样式类即可
Excel式拖拽批量选择实现
核心逻辑靠三个鼠标事件配合完成,没有复杂的第三方依赖:
- 定义三个全局状态变量:
isDragging = false(标记是否处于拖拽选中状态)、startCell = {weekday: 0, timeIndex: 0}(存储拖拽起始单元格坐标) - 监听单元格
mousedown事件:触发时将isDragging设为true,记录当前单元格为起始坐标,同时把该单元格加入选中集合 - 监听网格区域
mousemove事件:如果isDragging为true,读取当前鼠标悬停的单元格坐标,计算起始坐标到当前坐标的矩形覆盖范围,把范围内所有单元格批量加入选中集合,同步更新高亮样式 - 监听全局
mouseup事件+网格区域mouseleave事件:触发时将isDragging重置为false,结束本次拖拽选择 - 可选优化:mousemove事件加10ms左右的防抖,避免高频触发导致页面卡顿
数据输出与校验
- 选中状态集合可以很方便的转成结构化业务数据:把连续的同类型时段合并成一条记录,包含
weekday、startTime、endTime、type四个核心字段,满足后续存储或者提交接口的需求 - 可以根据业务需求加冲突校验,比如已经标记为休息的时段不可被选中为工作时段,拖拽过程中实时判断即可
可选扩展功能
- 支持按住Ctrl/Command键实现不连续区域加选,事件逻辑里判断按键按下状态即可
- 拖拽过程中悬浮提示当前选中的时段范围,给用户明确的操作反馈
- 移动端适配把鼠标事件替换成对应的触摸事件,核心逻辑完全复用

内容的提问来源于stack exchange,提问作者Olivier Mazur
相关产品推荐
相关产品推荐

