import './App.css';
import React, { useState, useEffect } from 'react';
function App() {
const (todos, setTodos) = useState(());
// Fetch todos on component mount
useEffect(() => {
fetch('http://localhost:8080/todos')
.then(response => response.json())
.then(data => setTodos(data))
.catch(error => console.error(error));
}, ());
// Function to add a new TODO item
const addTodo = (description) => {
fetch('http://localhost:8080/todos', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ description }),
})
.then(response => response.json())
.then(newTodo => setTodos((...todos, newTodo)))
.catch(error => console.error(error));
};
// Toggle completion
const toggleTodoComplete = (id) => {
const updatedTodos = todos.map(todo => {
if (todo.id === id) {
return { ...todo, completed: !todo.completed };
}
return todo;
});
setTodos(updatedTodos);
// Update completion
fetch(`http://localhost:8080/todos/${id}`, {
method: 'PUT',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ completed: !todos.find(todo => todo.id === id).completed }),
})
.catch(error => console.error(error));
};
const deleteTodo = (id) => {
const filteredTodos = todos.filter(todo => todo.id !== id);
setTodos(filteredTodos);
fetch(`http://localhost:8080/todos/${id}`, {
method: 'DELETE'
})
.catch(error => console.error(error));
};
Temos funções para criação, alternância de conclusão e exclusão. Para carregar as tarefas inicialmente, usamos o useEffect
efeito para chamar o servidor para o conjunto inicial de tarefas quando o React carrega a IU pela primeira vez. (Veja minha introdução aos ganchos do React para saber mais sobre useEffect
.)
useState
permite-nos definir o todos
variável. A API Fetch torna bem claro definir as chamadas de back-end e seus manipuladores com then
e catch
. O spread
operador também ajuda a manter as coisas concisas. Veja como definimos o novo todos
lista: