Resumen

Para crear las funcionalidades de completar y eliminar TODOs podemos crear una función que reciba el id o texto de nuestro TODO, para después editarlo o eliminarlo.

Completando TODOs

Creamos la función completeTodo, que recibirá el texto de nuestro TODO, ubicamos el TODO en nuestro arreglo, cambiamos el valor de la propiedad completed de nuestro TODO y muy importante actualizar nuestro estado, para que React pueda re-renderizar nuestros TODOs con los nuevos datos.

const completeTodo = (text) => { const todoIndex = todos.findIndex(todo => todo.text === text); const newTodos = [...todos]; newTodos[todoIndex].completed = true; setTodos(newTodos); };

Eliminando TODOs

Podemos hacer algo parecido a la función de completar, pero ahora, en lugar de cambiar si está completada o no, solamente la eliminaremos de nuestros TODOs con el método splice, y también regresaremos un nuevo arreglo con los TODOs actualizados.

const deleteTodo = (text) => { const todoIndex = todos.findIndex(todo => todo.text === text); const newTodos = [...todos]; newTodos.splice(todoIndex, 1); setTodos(newTodos); };

App.js

Una vez tenemos creada la lógica para completar y eliminar TODOs, podemos pasar esas funciones a nuestros TodoItem.

import React from 'react'; import { TodoCounter } from './TodoCounter'; import { TodoSearch } from './TodoSearch'; import { TodoList } from './TodoList'; import { TodoItem } from './TodoItem'; import { CreateTodoButton } from './CreateTodoButton'; // import './App.css'; const defaultTodos = [ { text: 'Cortar cebolla', completed: true }, { text: 'Tomar el cursso de intro a React', completed: false }, { text: 'Llorar con la llorona', completed: true }, { text: 'LALALALAA', completed: false }, ]; function App() { const [todos, setTodos] = React.useState(defaultTodos); const [searchValue, setSearchValue] = React.useState(''); const completedTodos = todos.filter(todo => !!todo.completed).length; const totalTodos = todos.length; let searchedTodos = []; if (!searchValue.length >= 1) { searchedTodos = todos; } else { searchedTodos = todos.filter(todo => { const todoText = todo.text.toLowerCase(); const searchText = searchValue.toLowerCase(); return todoText.includes(searchText); }); } const completeTodo = (text) => { const todoIndex = todos.findIndex(todo => todo.text === text); const newTodos = [...todos]; newTodos[todoIndex].completed = true; setTodos(newTodos); }; const deleteTodo = (text) => { const todoIndex = todos.findIndex(todo => todo.text === text); const newTodos = [...todos]; newTodos.splice(todoIndex, 1); setTodos(newTodos); }; return ( <React.Fragment> <TodoCounter total={totalTodos} completed={completedTodos} /> <TodoSearch searchValue={searchValue} setSearchValue={setSearchValue} /> <TodoList> {searchedTodos.map(todo => ( <TodoItem key={todo.text} text={todo.text} completed={todo.completed} onComplete={() => completeTodo(todo.text)} onDelete={() => deleteTodo(todo.text)} /> ))} </TodoList> <CreateTodoButton /> </React.Fragment> ); } export default App;

TodoItem.js

Para que nuestra aplicación funcione también tenemos que recibir las props en nuestros ítems y usarlas.

import React from 'react'; import './TodoItem.css'; function TodoItem(props) { return ( <li className="TodoItem"> <span className={`Icon Icon-check ${props.completed && 'Icon-check--active'}`} onClick={props.onComplete} > </span> <p className={`TodoItem-p ${props.completed && 'TodoItem-p--complete'}`}> {props.text} </p> <span className="Icon Icon-delete" onClick={props.onDelete} > X </span> </li> ); } export { TodoItem };

Contribución creada por: Brandon Argel.

      Completando y eliminando TODOs