我试图将目标待办事项标记为已完成,但当我按和待办事项为已完成时,所有列表都被标记为已完成,我试图找出原因,有人能解释一下我做错了什么吗?我还是个初学者,正在努力理解这样的行为.

函数handleDoneTask应该 for each 待办事项运行,当我按Done时,它应该在列表中将特定待办事项标记为已完成任务

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) => {
    const DoneArray = [...todos];
    DoneArray.map((_, key) => {
      if (id === key) {
        setDoneTast(true);
      }
    });
  };

  
  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;

}

推荐答案

因为您的所有任务都依赖于一个状态doneTask,所有任务的状态都是true/false.

解决方案将任务元素拆分到它自己的组件中,并将状态移动到任务组件.

import { useState } from "react";
import "./App.scss";

function Task({ todo, handleDelete, key }) {
  
  const [doneTask, setDoneTast] = useState(false);

  const handleDoneTask = (id) => {
        setDoneTast(true);
  };
  return <div className="arrange">
            <li className={doneTask ? "doneTask" : null}>{todo}</li>
            <a onClick={() => handleDoneTask(key)}>Done</a>
            <a onClick={() => handleDelete(key)}>Cancel</a>
          </div>
}

function App() {
  //Value of Input
  const [val, setVal] = useState("");
  const [todos, setTodos] = useState([]);

  const addTodos = (e) => {
    if (val == "") return;
    e.preventDefault();
    setTodos([...todos, val]);
    setVal("");
  };

  const handleDelete = (id) => {
    setTodos(todos.filter((_, key) => key !== id));
  };

  
  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) => (
          <Task todo={todo} key={key} handleDelete={handleDelete} />
        ))}
      </ul>
    </div>
  );
}

export default App;

Javascript相关问答推荐

使用json文件字符串来enum显示类型字符串无法按照计算的enum成员值的要求分配给类型号

在页面上滚动 timeshift 动垂直滚动条

屏幕右侧屏障上的产卵点""

数字时钟在JavaScript中不动态更新

我在Django中的视图中遇到多值键错误

为什么123[';toString';].long返回1?

正则表达式,允许我匹配除已定义的子字符串之外的所有内容

用于在路径之间移动图像的查询

如何将数组用作复合函数参数?

使用auth.js保护API路由的Next.JS,FETCH()不起作用

如何在我的Next.js项目中.blob()我的图像文件?

为什么当我更新数据库时,我的所有组件都重新呈现?

当代码另有说明时,随机放置的圆圈有时会从画布上消失

每次重新呈现时调用useState initialValue函数

如何在和IF语句中使用||和&;&;?

在Vercel中部署Next.js项目时获取`ReferenceError:未定义文档`

如何将字符串拆分成单词并跟踪每个单词的索引(在原始字符串中)?

如何在Reaction中设置缺省值, Select 下拉列表,动态追加剩余值?

在使用JavaScript以HTML格式显示Google Drive中的图像时遇到问题

Playwright:ReferenceError:browserContext未定义