javascript 将目标待办事项标记为完成,而不是将所有待办事项列表标记为完成

vltsax25  于 2023-03-28  发布在  Java
关注(0)|答案(1)|浏览(170)

当我按下目标任务时,我试图将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;

       }
new9mtju

new9mtju1#

这是正常的react行为。当你按下一个单独的todo时,所有的todo都被标记为done,因为所有的todo元素都检查同一个状态钩子doneTask,而不是它们自己的'doneTask'值。
你要做的是设置一个状态数组,其中包含每个todo元素自己的doneTask属性。(你可以把它放在你的todos钩子中)然后你做className={todos[i].doneTask ? "doneTask" : null}而不是className={doneTask ? "doneTask" : null}
你真的很接近了,你已经知道如何使用Spread语法(...)在状态钩子中编辑数组,所以只需要修改一些代码就可以了!

相关问题