本节将详细阐述任务管理应用核心功能的实现流程,通过分步骤解析任务添加、排序、分类及截止日期提醒的技术实现,构建完整的前端交互逻辑体系。每个功能模块均遵循"事件监听-数据处理-DOM渲染-持久化存储"的前端开发范式,确保功能完整性与用户体验连贯性。
任务添加作为用户与应用的首要交互点,需兼顾输入验证、数据结构定义与持久化存储。实现流程始于表单提交事件的监听,通过addEventListener绑定submit事件处理器,确保在用户提交任务时触发后续逻辑。输入验证环节需检查任务内容与截止日期的完整性,可通过以下条件判断:任务文本框值不为空且截止日期选择器有有效日期,避免创建无效任务数据。
验证通过后,需构建标准化的任务对象,典型结构应包含唯一标识符(可通过Date.now()生成时间戳ID)、任务描述文本、截止日期(ISO格式字符串)、完成状态(默认false)等核心字段。随后通过document.createElement创建任务DOM元素,设置其HTML结构与样式类,并使用appendChild方法将其动态添加至任务列表容器中,实现视图即时更新。
为确保页面刷新后任务数据不丢失,需调用localStorage.setItem('tasks', JSON.stringify(tasks))将任务数组序列化为JSON字符串并存储于本地。此过程需注意localStorage仅支持字符串存储,故需通过JSON.parse与JSON.stringify完成数据格式转换。
任务添加核心步骤:
form.addEventListener('submit', handleAddTask) if (!taskInput.value.trim() || !dueDateInput.value) return { id: Date.now(), text: taskInput.value, dueDate: dueDateInput.value, completed: false } taskList.appendChild(createTaskElement(newTask)) localStorage.setItem('tasks', JSON.stringify([...tasks, newTask]))任务排序功能通过用户交互触发,需在"按日期排序"按钮上绑定click事件监听器。核心实现依赖数组的toSorted方法,该方法相较于传统sort方法的优势在于返回排序后的新数组,不会修改原数组,符合函数式编程的不可变数据理念。排序逻辑通过比较函数(a, b) => a.dueDate.compare(b.dueDate)实现,其中dueDate应为Temporal.PlainDate类型以支持compare方法进行日期比较。
排序完成后需执行重新渲染操作,通常通过清空任务列表容器(taskList.innerHTML = '')并遍历排序后的数组,逐个调用任务创建函数实现视图更新。此过程需注意排序状态的维护,可通过添加按钮激活样式(如button.classList.add('active'))提升用户体验,明确当前排序状态。
任务分类基于完成状态将任务划分为"进行中"(active)与"已完成"(done)两个逻辑组,实现依赖ES2022新增的Object.groupBy方法。该方法接收任务数组与分类函数作为参数,分类函数通过三元表达式t => t.completed ? 'done' : 'active'将任务映射至对应分组键,返回结构为{ active: [...], done: [...] }的对象。
分类后需动态渲染两个独立的任务列表,建议在DOM中预设两个容器(如<div id="active-tasks">与<div id="done-tasks">),通过遍历分类对象的每个属性值(任务数组),分别调用渲染函数生成对应列表。为增强视觉区分度,可对已完成任务添加样式处理(如文本删除线、灰度背景),通过element.classList.add('task-completed')实现样式标记。
截止日期提醒通过日期对比识别过期任务并应用视觉警示,核心依赖Temporal API处理日期逻辑。使用Temporal.Now.plainDateISO()获取当前日期(本地时区),该方法返回Temporal.PlainDate实例,支持直接与任务的dueDate(需同样解析为Temporal.PlainDate类型)进行比较。
日期比较逻辑通过Temporal.PlainDate.compare(taskDueDate, currentDate)实现:当结果小于0时,任务已过期;等于0时为当天截止;大于0时为未来任务。对过期任务,通过element.style.borderLeft = '4px solid #ff4d4f'添加左侧红色边框,或设置backgroundColor: '#fff1f0'实现背景色提醒,强化视觉警示效果。需注意在任务渲染函数中集成此逻辑,确保每次任务列表更新时均重新计算过期状态。
日期比较核心代码:
const currentDate = Temporal.Now.plainDateISO();
const taskDueDate = Temporal.PlainDate.from(task.dueDate);
if (Temporal.PlainDate.compare(taskDueDate, currentDate) < 0) {
taskElement.classList.add('task-overdue');
}
通过上述四个核心功能模块的协同实现,任务管理应用具备了基本的CRUD操作、数据组织与用户提醒能力,为后续高级功能(如任务编辑、标签管理)奠定了技术基础。各模块间通过任务数组作为数据中枢实现联动,确保数据状态的一致性与操作的原子性。