以不可变的方式改变 React 状态

Change React state in immutable way

我有一个状态,它由 Exam 对象数组组成,它的一个参数 (tasks) 也是对象数组。我需要更改一个对象 (exam[=18] 中参数数组 (tasks) 的一项的参数 (status) =]) 以不可变的方式。非常感谢您的帮助。

const changeTaskStatus = useCallback((id) =>{
  setExams(prev => prev.map((exam) =>{
    if (exam.tasks.find(task => task.id === id)) {
      const examCopy = {...exam};
      examCopy.tasks.map(task => {
        if (task.id === id) {
          const taskCopy = {...task};
          task.status = true;
          return taskCopy
        } else {
          return task
        }
      })
      return examCopy;
    } else {
      return exam
    }
  }))
}, [setExams])

如果您希望更新与某个 ID 匹配的所有任务的状态,那么这里是一个解决方案:

const update = () => {
  const taskIdToUpdate = 2;
  setData(
    data.map((exam) => ({
      ...exam,
      tasks: exam.tasks.map((task) => {
        if (task.taskId === taskIdToUpdate)
          return { ...task, status: !task.status };
        return task;
      })
    }))
  );
};

完整沙盒 - https://codesandbox.io/s/cranky-water-0qhzh0?file=/src/App.js:432-742