【发布时间】:2022-01-01 21:35:15
【问题描述】:
我正在尝试编写待办事项列表。我有一个包含所有任务作为对象的数组。 每个任务都有一个名为“已检查”的属性,以指示我是否已检查此任务。 当一个任务被检查时,我有 onClicked 函数,它改变了数组中指定任务的“检查”属性,在这一点上我有一个“重新渲染太多”的错误。 希望得到你的帮助..
import { useEffect, useState } from "react";
import react from "react";
import "./styles.css";
export default function ToDoList() {
const [allTasks, setAllTasks] = useState([]);
const [newTask, setNewTask] = useState({ value: "" });
const [currentIndex, setCurrentIndex] = useState(0);
const handleChanged = ({ target }) => {
setNewTask({
value: target.value,
id: currentIndex,
checked: false
});
};
function onClicked() {
if (newTask.value === "") return;
setAllTasks((prev) => {
return [newTask, ...prev];
});
setNewTask({ value: "" });
setCurrentIndex((prevCurrentIndex) => prevCurrentIndex + 1);
}
const handleKeyPress = (event) => {
if (event.keyCode === 13) {
onClicked();
}
};
const onCheck = (i) => {
const task = { ...allTasks[i] };
task.checked = !task.checked;
const taskState = [...allTasks];
taskState[i] = task;
setAllTasks(taskState);
};
return (
<div>
<h1>
<u>
<b>To Do List</b>
</u>
</h1>
<input
value={newTask.value}
onChange={handleChanged}
onKeyDown={handleKeyPress}
/>
<button onClick={onClicked} />
<h1>{newTask.value}</h1>
<lo>
{allTasks.map((item, i) => (
<li>
{item.checked ? (
<input type="checkbox" checked={true} onClick={onCheck(i)} />
) : (
<input type="checkbox" checked={false} onClick={onCheck(i)} />
)}
{item.value}
</li>
))}
</lo>
</div>
);
}
【问题讨论】: