当我按下目标任务时,我试图将todo标记为done,而当我按下done时,所有的todo都标记为done。我不知道为什么会发生这种行为,因为我将setDoneTast设置为true,所以css类将运行。
import { useState } from "react";
import "./App.scss";
function App() {
//Value of Input
const [val, setVal] = useState("");
const [todos, setTodos] = useState([]);
const [doneTask, setDoneTast] = useState(false);
const addTodos = (e) => {
if (val == "") return;
e.preventDefault();
setTodos([...todos, val]);
setVal("");
};
const handleDelete = (id) => {
setTodos(todos.filter((_, key) => key !== id));
};
** const handleDoneTask = (id) => {
setDoneTast(!doneTask);
};**
return (
<div className="App">
{/** On change values*/}
<form onSubmit={addTodos}>
<input
onChange={(e) => setVal(e.target.value)}
value={val}
type="text"
/>
<button type="submit">Add</button>
</form>
<ul>
{todos.map((todo, key) => (
<div className="arrange" key={key}>
<li className={doneTask ? "doneTask" : null}>{todo}</li>
**<a onClick={() => handleDoneTask(key)}>Done</a>**
<a onClick={() => handleDelete(key)}>Cancel</a>
</div>
))}
</ul>
</div>
);
}
export default App;
//CSS
.doneTask {
text-decoration: line-through!important;
}
1条答案
按热度按时间new9mtju1#
这是正常的react行为。当你按下一个单独的todo时,所有的todo都被标记为done,因为所有的todo元素都检查同一个状态钩子doneTask,而不是它们自己的'doneTask'值。
你要做的是设置一个状态数组,其中包含每个todo元素自己的doneTask属性。(你可以把它放在你的todos钩子中)然后你做
className={todos[i].doneTask ? "doneTask" : null}
而不是className={doneTask ? "doneTask" : null}
你真的很接近了,你已经知道如何使用Spread语法(...)在状态钩子中编辑数组,所以只需要修改一些代码就可以了!