Aquí está mi componente:
Después de hacer clic en eliminar, la casilla de verificación debajo se marca, aunque nunca se hizo clic en ella.
Aquí están las implementaciones de los componentes principal y secundario (nuevo en React)
TaskList.js
import { useState, useRef } from "react"; import Task from "./Task"; function TaskList({ className, tasks, setTasks }) { let inputRef = useRef(); return ( <div className={className}> <ul className="grow overflow-y-scroll"> {tasks.map((task, i) => ( <Task description={task.description} onChange={() => { task.checked = !task.checked; }} /> ))} </ul> <input className="my-2 border-b-2 border-blue-300" placeholder="Enter task description..." ref={inputRef} ></input> <button className="rounded-md bg-blue-400 w-full p-4 text-white text-2xl" onClick={() => { setTasks([ ...tasks, { description: inputRef.current.value, checked: false }, ]); }} > Add </button> <button className="w-full bg-red-600 rounded-md p-2" onClick={() => { setTasks(tasks.filter((t) => !t.checked)); }} > Delete </button> </div> ); } export default TaskList;tarea.js
import React, { useState } from "react"; function Task({ description, onChange }) { return ( <li className="flex flex-row my-2"> <input className="mx-2" type="checkbox" onChange={onChange}></input> <span>{description}</span> </li> ); }Te faltan claves del componente Task y estás usando componentes no controlados, por lo que cuando hay una nueva representación, no le estás diciendo a React lo suficiente sobre qué elemento que existe en el DOM corresponde a qué <Task> . La mejor solución sería:
.maptask.checked = !task.checked; debe ser refactorizado.Algo del estilo de:
function TaskList({ className, tasks, setTasks }) { const [value, setValue] = useState(''); // <------------------- return ( <div className={className}> <ul className="grow overflow-y-scroll"> {tasks.map((task, i) => ( <Task key={task.description} // <------------------- description={task.description} checked={task.checked} // <------------------- onChange={() => { setTasks( // <------------------- tasks.map( (task, j) => i !== j ? task : { ...task, checked: !task.checked } ) ); }} /> ))} </ul> <input className="my-2 border-b-2 border-blue-300" placeholder="Enter task description..." value={value} // <------------------- onChange={(e) => setValue(e.currentTarget.value)} // <------------------- ></input> <button className="rounded-md bg-blue-400 w-full p-4 text-white text-2xl" onClick={() => { setTasks([ ...tasks, { description: value, checked: false }, // <------------------- ]); }} > ... function Task({ description, onChange, checked }) { // <------------------- return ( <li className="flex flex-row my-2"> <input className="mx-2" type="checkbox" onChange={onChange} checked={checked} /> // <------------------- <span>{description}</span> </li> ); }