Para utilizar o useState e o fetch em componentes do Next.js (especialmente no App Router moderno), precisamos garantir que o código rode no lado do cliente. Por isso, esses exemplos assumem que você está usando a diretiva "use client" no topo do seu arquivo e um estado base como este:
"use client";
import { useState, useEffect } from 'react';
// Exemplo de estado base no seu componente
// const [items, setItems] = useState([]);
Abaixo estão os 4 códigos separados para as operações de CRUD (Create, Read, Update, Delete) consumindo uma API genérica (/api/items).
Utiliza o método POST para enviar novos dados para a API e, em seguida, atualiza o estado local adicionando o novo item à lista.
const handleCreate = async (newItemData) => {
try {
const response = await fetch('/api/items', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(newItemData), // Envia os dados no corpo da requisição
});
if (!response.ok) throw new Error('Erro ao criar item');
const createdItem = await response.json();
// Atualiza o estado adicionando o novo item ao final do array
setItems((prevItems) => [...prevItems, createdItem]);
} catch (error) {
console.error(error);
}
};
Utiliza o método GET (padrão do fetch) para buscar os dados da API. Geralmente, essa função é chamada dentro de um useEffect quando a página carrega.
const handleRead = async () => {
try {
const response = await fetch('/api/items', {
method: 'GET', // Opcional, GET é o padrão
});
if (!response.ok) throw new Error('Erro ao buscar itens');
const data = await response.json();
// Atualiza o estado com a lista recebida da API
setItems(data);
} catch (error) {
console.error(error);
}
};
// Exemplo de uso ao carregar a página:
// useEffect(() => { handleRead(); }, []);
Utiliza o método PUT ou PATCH para atualizar um item específico através do seu ID. O estado local é mapeado para substituir apenas o item que foi modificado.
const handleUpdate = async (id, updatedData) => {
try {
const response = await fetch(`/api/items/${id}`, {
method: 'PUT', // Ou PATCH, dependendo da sua API
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(updatedData),
});
if (!response.ok) throw new Error('Erro ao atualizar item');
const updatedItem = await response.json();
// Mapeia o estado antigo, substituindo o item editado e mantendo os outros
setItems((prevItems) =>
prevItems.map((item) => (item.id === id ? updatedItem : item))
);
} catch (error) {
console.error(error);
}
};
Utiliza o método DELETE informando o ID do item na URL. Após a exclusão com sucesso na API, o estado local é filtrado para remover o item da tela sem precisar recarregar a página.
const handleDelete = async (id) => {
try {
const response = await fetch(`/api/items/${id}`, {
method: 'DELETE',
});
if (!response.ok) throw new Error('Erro ao deletar item');
// Filtra o estado removendo o item que possui o ID deletado
setItems((prevItems) => prevItems.filter((item) => item.id !== id));
} catch (error) {
console.error(error);
}
};