我该如何解决反应数组映射功能错误?

How can I solve react array map function bug?

我正在尝试制作一个带有 React 的待办事项应用程序。它具有基本功能:项目添加、项目删除和完成任务。在我的代码中,功能可以正常工作,但是当我单击完成按钮并同时删除该项目时,它会出现问题。项目删除但已完成复选框添加下一个项目。

Image Here

代码部分: App.js

import './App.css';
import Header from './components/Header'; 
import List from './components/List';
import React, { useState, useEffect } from 'react';

function App() {

  const [elements, setElements] = useState([]);

  useEffect(() => {
    console.log(elements);
  }, [elements]);

  const setElement = (element) => {
    setElements([...elements, element]);
  }

  const completeElement = (index) => {
    let array = [...elements];
    array[index].isCompleted = !array[index].isCompleted;
    setElements(array);
 }

  const deleteElement = (index) => {
    let array = [...elements];
    array.splice(index, 1);
    setElements(array);
  }

  return (
    <div className="todoapp">
      <Header save={setElement} />
      <List elements={elements} complete={completeElement} remove={deleteElement} />
    </div>
  );
}

export default App;

List.js:

{elements.map((item, index) => {
    const status = item.isCompleted ? "completed" : "";
    return(
        <li className={status}  key={index}>
            <div className="view">
                 <input className="toggle" type="checkbox" onClick={() => {complete(index)}} />
                 <label>{item.text}</label>
                 <button className="destroy" onClick={() => {remove(index)}}></button>
              </div>
          </li> 
      );
 })}

在 List.js,className={status} 正在运行的越野车。

感谢您的帮助。

不要在地图项中使用索引作为键,而应使用项 ID。这是问题的原因

您可以在这里阅读为什么我们需要 Reac 列表中的键 https://adhithiravi.medium.com/why-do-i-need-keys-in-react-lists-dbb522188bbb

您应该在 input 中添加 checked:

<input ... checked={item.isCompleted} />