import React, { useState, useEffect } from 'react';
import axios from 'axios';
const App = () => {
// Estado de los posts. Aquí cargaremos la información de la api
// Parecido a la de tareas
const [posts, setPosts] = useState([]);
// Para el formulario, en este caso todos los campos dentro de un objeto
const [nuevoPost, setNuevoPost] = useState({ title: '', body: '' });
// Esto se ejecuta la primera vez
useEffect(() => {
// Llamamos a la función que carga los posts
obtenerPosts();
}, []);
// Aquí tenemos tres funciones porque son las tres operaciones que podemos hacer:
// Leer, añadir y eliminar.
// Es mejorable, pero funciona
// Llamamos con axios a la api y ponemos lo obtenido en el estado
const obtenerPosts = async () => {
try {
const response = await axios.get('http://localhost:4000/posts');
setPosts(response.data);
} catch (error) {
console.error('Error al obtener posts:', error);
}
};
// LLamamamos a la api con POST y los datos del formulario
const agregarPost = async () => {
try {
await axios.post('http://localhost:4000/posts', nuevoPost);
// Ponemos a cero el formulario
setNuevoPost({ title: '', body: '' });
// Cargadmos los datos de la api (podríamos hacerlo directamente en el estado)
obtenerPosts();
} catch (error) {
console.error('Error al agregar post:', error);
}
};
// Llamamos a la api con DELETE
const eliminarPost = async (id) => {
try {
await axios.delete(`http://localhost:4000/posts/${id}`);
// Cargamos los datos de nuevo
obtenerPosts();
} catch (error) {
console.error('Error al eliminar post:', error);
}
};
return (
<div>
<h1>Posts</h1>
<ul>
{/* Lista de todos los posts con su 'key */}
{posts.map((post) => (
<li key={post.id}>
<h2>{post.title}</h2>
<p>{post.body}</p>
<button onClick={() => eliminarPost(post.id)}>Eliminar</button>
</li>
))}
</ul>
{/** Formulario, el change no llama a ninguna función, directamente cambia el estado en
* los dos campos. Yo prefiero hacerlo con una sola función.
*/}
<h2>Agregar nuevo post</h2>
<input
type="text"
value={nuevoPost.title}
onChange={(e) => setNuevoPost({ ...nuevoPost, title: e.target.value })}
placeholder="Título"
/>
<textarea
value={nuevoPost.body}
onChange={(e) => setNuevoPost({ ...nuevoPost, body: e.target.value })}
placeholder="Cuerpo"
/>
<button onClick={agregarPost}>Agregar post</button>
</div>
);
};
export default App;
db.json
{
"posts": [
{
"id": "1",
"title": "Post 1",
"body": "Cuerpo del post 1"
},
{
"id": "29d4",
"title": "Post 3",
"body": "holi"
},
{
"id": "e4da",
"title": "dfsdfsdfsd",
"body": "asdasd"
}
]
}