这个问题是由于 useEffect 的依赖项和检查逻辑导致的。在 TaskManager.js 中,我们需要修改一下检查逻辑,确保不会重复创建任务:
// 当年份、周数或默认模板发生变化时,自动创建默认任务
useEffect(() => {
// 检查当前年份和周数是否已经有任务
const existingTasks = tasks.filter(
task => task.year === selectedYear &&
task.week === selectedWeek &&
task.taskType === selectedTaskType
);
// 检查是否已经创建了所有默认模板的任务
const missingTemplates = defaultTemplates.filter(template =>
!existingTasks.some(task =>
task.name === template.name &&
task.taskType === selectedTaskType
)
);
// 只创建缺失的模板任务
if (missingTemplates.length > 0) {
const newTasks = missingTemplates.map(template => {
const taskCode = generateTaskCode(
selectedTaskType,
selectedYear,
selectedWeek,
template.name
);
return {
...template,
id: Date.now() + Math.random(),
year: selectedYear,
week: selectedWeek,
taskType: selectedTaskType,
code: taskCode,
processes: template.processes.map(process => ({
...process,
id: Date.now() + Math.random(),
status: 'pending'
}))
};
});
setTasks(prevTasks => [...prevTasks, ...newTasks]);
}
}, [selectedYear, selectedWeek, selectedTaskType, defaultTemplates]);
主要修改:
- 使用 filter 而不是 some 来获取所有现有任务
- 检查每个默认模板是否已经创建了对应的任务
- 只创建那些还没有创建的模板任务
这样修改后:
- 每个默认模板在每个周期只会创建一次任务
- 刷新页面不会导致重复创建任务
- 切换周期时仍然会正确创建默认任务
需要我对某部分做进一步的调整或解释吗?