CRUD con React Hooks y Axios: Aprende a manipular datos

Go to Homepage

Introducción a React Hooks y Axios

En el desarrollo de aplicaciones web, la manipulación de datos es una tarea fundamental. En ocasiones, cuando trabajamos con grandes cantidades de información, este proceso puede volverse tedioso y complejo. En este sentido, las tecnologías de React Hooks y Axios nos ofrecen una solución eficaz.

React Hooks es una característica que nos brinda React para agregar funcionalidades a nuestros componentes. Estas funcionalidades, llamadas “hooks”, nos permiten trabajar con estados y efectos, entre otras cosas. Por su parte, Axios es una biblioteca de JavaScript que se utiliza para realizar peticiones HTTP. Axios nos permite interactuar con una API de forma fácil y sencilla.

En este artículo, te enseñaremos a utilizar React Hooks y Axios para desarrollar un sistema CRUD completo. Con estas herramientas podrás establecer una conexión con tu API, obtener y manipular datos en tiempo real.

Usando React Hooks

Lo primero que debemos hacer es entender cómo funcionan los estados en React. En pocas palabras, un estado es una variable que almacena información relevante para nuestro componente.

Los estados en React se manejan mediante una función llamada useState. Esta función recibe como argumento el valor inicial que queremos guardar en el estado, y devuelve un array con dos elementos. El primer elemento es la variable que acabamos de crear, y el segundo elemento es una función que podemos utilizar para actualizar el valor de la variable.

Veamos un ejemplo:

import React, { useState } from "react";

function App() {
    const [contador, setContador] = useState(0);
    return (
        <div>
            <p>Contador: {contador}</p>
            <button onClick={() => setContador(contador + 1)}>+</button>
            <button onClick={() => setContador(contador - 1)}>-</button>
        </div>
    );
}

En este ejemplo creamos una variable llamada “contador”, la inicializamos con el valor cero y usamos useState para definir el estado de esta variable.

También creamos dos botones con funciones onClick, que nos permiten sumar o restar valores al contador.

Conexión con nuestra API

Ahora bien, si queremos trabajar con una API desde React, necesitamos usar otra herramienta: Axios.

Para hacer una petición HTTP con Axios, necesitamos utilizar el método correspondiente. En su forma más simple, podemos usar el método GET para recuperar información de nuestra API.

Veamos este código de ejemplo:

import React, { useState, useEffect } from "react";
import axios from "axios";

function App() {
    const [datos, setDatos] = useState([]);
    useEffect(() => {
        const obtenerDatos = async () => {
            const respuesta = await axios.get("https://api.example.com/datos");
            setDatos(respuesta.data);
            console.log(respuesta.data);
        };
        obtenerDatos();
    }, []);
    return (
        <div>
            {datos.map((dato) => (
                <p>{dato.valor}</p>
            ))}
        </div>
    );
}

export default App;

En este ejemplo, usamos useEffect para que nuestra petición HTTP se haga solo una vez. La función asíncrona obtenerDatos inicia la petición GET a nuestra API, usando el método axios.get. Esta petición retorna un objeto de respuesta que contiene la información que necesitamos.

Luego, usamos setDatos para actualizar el estado de nuestra variable “datos”. Adicionalmente, hacemos uso de map para renderizar los valores de nuestra respuesta en nuestro componente React.

Conclusión

Con React Hooks y Axios podemos trabajar con una API de forma muy eficiente y dinámica. Utilizando solo unas pocas líneas de código podemos implementar un sistema CRUD completo para manipular datos en tiempo real.

Es importante destacar que antes de comenzar a trabajar con estas herramientas, es necesario tener conocimientos sobre JavaScript y React. Sin embargo, una vez que hayas dominado estos conceptos, podrás utilizarlas para desarrollar aplicaciones web profesionales y sofisticadas. ¡Así que a programar!

Cómo crear una API RESTful

Al crear una aplicación web, a menudo necesitamos tener una API RESTful para manejar las solicitudes de los clientes. En esta sección, te mostraré cómo crear una API RESTful utilizando Node.js y Express.

Para empezar, debemos instalar Express con npm install express --save en nuestra carpeta de proyecto. Después, crearemos una carpeta llamada “routes” que contendrá todos nuestros archivos de enrutamiento API. Luego, dentro de esta carpeta, crearemos un archivo llamado “example.js”.

En el archivo “example.js”, debemos importar Express y crear una instancia del enrutador const router = express.Router(). Luego, podemos definir nuestras rutas y sus controladores con los verbos HTTP que necesitemos. Un ejemplo sería:

router.get("/", (req, res) => {
    res.send("Esta es una respuesta GET");
});

router.post("/", (req, res) => {
    res.send("Esta es una respuesta POST");
});

En este ejemplo, estamos definiendo una ruta raíz para el método GET y POST. Podemos usar cualquiera de los métodos HTTP que necesitemos, como PUT, DELETE, etc.

Una vez que hayamos definido nuestras rutas y controladores, debemos exportar nuestro enrutador module.exports = router. Ahora podemos utilizar nuestro enrutador en nuestro archivo principal app.js utilizando el método app.use('/api', exampleRouter) donde “api” es una subruta que utilizaremos para nuestras rutas API.

Finalmente, para ejecutar nuestra API RESTful, podemos utilizar el comando node app.js en la terminal y nuestra API estará disponible en la ruta http://localhost:3000/api.

Ahora que hemos creado nuestra API RESTful, podemos utilizarla en nuestra aplicación React para manejar las solicitudes de los clientes utilizando Axios. En nuestro componente React, podemos utilizar el método axios.get('/api') para realizar una solicitud GET a nuestra API y obtener una respuesta.

import axios from "axios";

axios
    .get("/api")
    .then((response) => console.log(response))
    .catch((error) => console.log(error));

En este ejemplo, estamos haciendo una solicitud GET a nuestra ruta raíz de API y utilizando then para manejar la respuesta y catch para manejar los errores.

Hemos aprendido cómo crear una API RESTful utilizando Node.js y Express, y cómo utilizar Axios en nuestra aplicación React para manejar las solicitudes de los clientes. Ahora podemos manipular datos con nuestra aplicación CRUD utilizando estas herramientas. ¡Buena suerte en el desarrollo de tu próxima aplicación web!

Cómo utilizar los hooks useState y useEffect

Usar hooks en React se ha convertido en una práctica indispensable para optimizar nuestros proyectos y aumentar nuestra productividad. En esta ocasión, nos enfocaremos en cómo utilizar dos de los hooks más utilizados en React: useState y useEffect.

useState

El hook useState nos permite agregar y manipular estados en nuestros componentes. Para utilizarlo, debemos importarlo de la siguiente manera:

import React, { useState } from "react";

Luego, podemos declarar un estado en nuestro componente de la siguiente manera:

const [nombreEstado, setNombreEstado] = useState("valorInicial");

En este ejemplo, nombreEstado es el nombre que le damos a nuestro estado y setNombreEstado es la función que nos permitirá actualizar su valor. El parámetro ("valorInicial") es el valor que tendrá nuestro estado al inicio.

Por ejemplo, supongamos que queremos agregar un estado para manejar el valor de un input en nuestro componente. El código se vería así:

import React, { useState } from "react";

function Componente() {
    const [valorInput, setValorInput] = useState("");

    const handleChangeInput = (evento) => {
        setValorInput(evento.target.value);
    };

    return (
        <div>
            <input value={valorInput} onChange={handleChangeInput} />
        </div>
    );
}

export default Componente;

En este caso, el estado valorInput se inicializa en una cadena vacía y la función handleChangeInput se encarga de actualizar su valor cada vez que un usuario escribe algo en el input. Este ejemplo nos da una idea de cómo los estados nos permiten manejar y acceder a los datos de nuestro componente de forma más sencilla.

useEffect

El hook useEffect nos permite ejecutar una función después de que un componente se haya renderizado, en otras palabras, nos permite agregar efectos secundarios a nuestros componentes. Para utilizarlo, debemos importarlo de la siguiente manera:

import React, { useState, useEffect } from "react";

Luego, podemos declarar una función que se ejecutará cada vez que nuestro componente se renderice:

useEffect(() => {
    // código a ejecutar
}, [dependencias]);

En este ejemplo, dependencias es un arreglo que contiene variables que serán monitoreadas por el hook. Si alguna de ellas cambia, la función se ejecutará nuevamente.

Por ejemplo, supongamos que queremos hacer una petición a una API para obtener una lista de productos en nuestro componente. El código se vería así:

import React, { useState, useEffect } from "react";
import axios from "axios";

function Componente() {
    const [productos, setProductos] = useState([]);

    useEffect(() => {
        const obtenerProductos = async () => {
            const resultado = await axios.get("urlDeLaAPI");
            setProductos(resultado.data);
        };

        obtenerProductos();
    }, []);

    return (
        <div>
            {productos.map((producto) => (
                <div key={producto.id}>{producto.nombre}</div>
            ))}
        </div>
    );
}

export default Componente;

En este caso, la función obtenerProductos se ejecutará una vez que el componente se haya renderizado (gracias al arreglo vacío de dependencias). La petición se realiza con axios.get y el resultado se almacena en el estado productos. Finalmente, podemos mostrar los productos usando un map.

Como podemos ver, los hooks useState y useEffect nos permiten agregar y manipular estados de nuestros componentes de manera fácil y efectiva. Además, nos permiten agregar efectos secundarios a nuestras aplicaciones, como peticiones a una API. ¡Aprovechemos al máximo su potencial para crear aplicaciones aún mejores con React!

Implementación del CRUD con Axios y React

Si has trabajado con aplicaciones web, es probable que hayas oído hablar del término CRUD, que significa Crear, Leer, Actualizar y Borrar. Un CRUD es una serie de operaciones básicas que se utilizan para manipular datos en una base de datos o en cualquier otro tipo de almacenamiento de datos. En este artículo, aprenderemos cómo implementar un CRUD utilizando Axios y React Hooks.

Lo primero que debes saber es que Axios es una librería de JavaScript que se utiliza para hacer solicitudes HTTP desde cualquier aplicación web. En el contexto de React, podemos utilizar Axios para comunicarnos con una API que nos proporcione datos para nuestra aplicación web. Por otro lado, los React Hooks son una característica de la biblioteca React que nos permite agregar estado y otras características a los componentes funcionales de React.

Para implementar un CRUD en React, necesitaremos crear cuatro funciones diferentes: la función para consultar los datos (Read), la función para agregar datos (Create), la función para actualizar datos (Update) y la función para eliminar datos (Delete). A continuación, mostraremos un ejemplo de cómo podrían lucir estas funciones utilizando Axios y React Hooks:

import React, { useState, useEffect } from "react";
import axios from "axios";

function App() {
    const [data, setData] = useState([]);

    useEffect(() => {
        axios
            .get("https://mi-api.com/data")
            .then((response) => setData(response.data))
            .catch((error) => console.log(error));
    }, []);

    const handleCreate = (newData) => {
        axios
            .post("https://mi-api.com/data", newData)
            .then((response) => setData([...data, response.data]))
            .catch((error) => console.log(error));
    };

    const handleUpdate = (id, updatedData) => {
        axios
            .put(`https://mi-api.com/data/${id}`, updatedData)
            .then((response) => {
                const updatedDataIndex = data.findIndex(
                    (item) => item.id === id
                );
                const updatedArray = [...data];
                updatedArray[updatedDataIndex] = response.data;
                setData(updatedArray);
            })
            .catch((error) => console.log(error));
    };

    const handleDelete = (id) => {
        axios
            .delete(`https://mi-api.com/data/${id}`)
            .then((response) => {
                const filteredData = data.filter((item) => item.id !== id);
                setData(filteredData);
            })
            .catch((error) => console.log(error));
    };

    // el resto del componente...
}

En este ejemplo, primero importamos React, useState, useEffect y axios. Las dos primeras son funciones de React que nos permiten agregar estado a los componentes funcionales. Axios lo utilizamos para comunicarnos con nuestra API.

En la función App(), primero declaramos una variable state llamada data con el valor inicial de un arreglo vacío. Luego, utilizamos el efecto de React para hacer una solicitud GET a nuestra API y actualizar el estado de data basado en los datos que recibimos.

Después, creamos tres funciones llamadas handleCreate(), handleUpdate() y handleDelete() que utilizan las funciones correspondientes de Axios para agregar, actualizar y eliminar datos en nuestra API. En cada una de las funciones, primero llamamos la función adecuada de Axios y luego actualizamos el estado de data basado en la respuesta que recibimos.

Utilizar Axios y React Hooks para implementar un CRUD puede ser una excelente manera de simplificar la manipulación de datos en una aplicación web. Al utilizar estas herramientas, podemos concentrarnos en la lógica de nuestra aplicación y dejar la manipulación de datos en manos de Axios.

Validación de datos en formularios

Una de las partes más importantes de un CRUD es la validación de datos en los formularios. Sin esta validación, podríamos estar permitiendo que los usuarios introduzcan información incorrecta o incompleta en nuestro sistema. Por eso, en este artículo vamos a ver cómo podemos hacer esta validación de manera sencilla pero efectiva.

Lo primero que debemos hacer es definir las reglas de validación para cada campo en nuestro formulario. Por ejemplo, podemos decir que el campo de correo electrónico debe contener una dirección válida, el campo de contraseña debe tener al menos 8 caracteres, etc. Para hacer esto, podemos usar una librería como Yup o Joi, que nos permitirán definir estas reglas de manera sencilla.

Una vez que tenemos nuestras reglas de validación, podemos usar React Hooks para crear un formulario controlado. Esto significa que en lugar de dejar que el navegador maneje el estado del formulario, lo manejaremos nosotros mismos con useState. De esta manera, podemos validar los campos en tiempo real y mostrar mensajes de error al usuario si es necesario.

Aquí hay un ejemplo de cómo podríamos crear un formulario controlado con React Hooks:

import React, { useState } from "react";
import * as Yup from "yup";

const schema = Yup.object().shape({
    email: Yup.string().email().required(),
    password: Yup.string().min(8).required(),
});

function ValidatedForm() {
    const [formData, setFormData] = useState({
        email: "",
        password: "",
    });

    const [errors, setErrors] = useState({});

    const handleChange = (event) => {
        const { name, value } = event.target;

        setFormData((prevState) => ({
            ...prevState,
            [name]: value,
        }));

        schema
            .validate({ [name]: value })
            .then(() =>
                setErrors((prevState) => ({ ...prevState, [name]: null }))
            )
            .catch((error) =>
                setErrors((prevState) => ({
                    ...prevState,
                    [name]: error.message,
                }))
            );
    };

    const handleSubmit = (event) => {
        event.preventDefault();

        schema
            .validate(formData, { abortEarly: false })
            .then(() => {
                // Make API request
            })
            .catch((error) => {
                const newErrors = {};

                for (const validationError of error.inner) {
                    newErrors[validationError.path] = validationError.message;
                }

                setErrors(newErrors);
            });
    };

    return (
        <form onSubmit={handleSubmit}>
            <label>
                Email:
                <input
                    type="email"
                    name="email"
                    value={formData.email}
                    onChange={handleChange}
                />
                {errors.email && <p>{errors.email}</p>}
            </label>
            <label>
                Password:
                <input
                    type="password"
                    name="password"
                    value={formData.password}
                    onChange={handleChange}
                />
                {errors.password && <p>{errors.password}</p>}
            </label>
            <button type="submit">Submit</button>
        </form>
    );
}

En este ejemplo, hemos creado un formulario con dos campos: correo electrónico y contraseña. Cada vez que uno de estos campos cambia, validamos su valor con Yup y mostramos un mensaje de error si es necesario. Cuando se envía el formulario, validamos todos los campos juntos y enviamos una solicitud a nuestra API si todo está correcto.

Validar los datos en los formularios de nuestro CRUD es fundamental para asegurarnos de que estamos recibiendo información de calidad en nuestro sistema. Con React Hooks y la ayuda de librerías como Yup, podemos hacer esta validación de manera sencilla y efectiva. ¡Ahora es tu turno de hacerlo en tu proyecto!

Gestión de errores y mensajes de alerta

Cuando programamos aplicaciones, es común encontrarnos con errores en nuestro código. Por eso, es importante manejar estos errores de manera adecuada para que el usuario final no tenga una mala experiencia al utilizar nuestra aplicación. En este artículo, te enseñaremos cómo manejar los errores y mensajes de alerta en una aplicación de CRUD con React Hooks y Axios.

En primer lugar, cuando trabajamos con Axios, es importante saber que este librería tiene su propio manejo de errores. En otras palabras, en caso de que la petición falle, Axios nos devolverá un objeto que contiene información sobre el error. A partir de ahí, podemos personalizar el mensaje de error que queremos mostrar al usuario.

Para manejar los errores en nuestro código, podemos utilizar un bloque try-catch. Dentro del bloque try, realizaremos la petición a nuestra API. En caso de que la petición falle, el programa saltará al bloque catch, donde podremos manejar el error.

const [error, setError] = useState(null);

const handleDelete = async (id) => {
    try {
        await axios.delete(`${API_URL}/${id}`);
    } catch (err) {
        setError(err.message);
    }
};

En este ejemplo, estamos utilizando una función llamada handleDelete, la cual se encarga de eliminar un elemento de nuestra lista. En caso de que la petición falle, almacenaremos el mensaje de error en una variable de estado llamada error.

A partir de ahí, podemos utilizar la variable de estado para mostrar un mensaje de alerta al usuario. En este ejemplo, utilizaremos la librería react-toastify para mostrar el mensaje de error.

import { toast } from "react-toastify";
import "react-toastify/dist/ReactToastify.css";

const App = () => {
    const [error, setError] = useState(null);

    useEffect(() => {
        if (error) {
            toast.error(error);
        }
    }, [error]);

    const handleDelete = async (id) => {
        try {
            await axios.delete(`${API_URL}/${id}`);
        } catch (err) {
            setError(err.message);
        }
    };

    return (
        <>
            <ToastContainer />
            ...
        </>
    );
};

En este ejemplo, utilizamos la función useEffect para verificar si la variable de estado error ha sido actualizada. En caso de que lo haya sido, utilizamos la función toast.error de react-toastify para mostrar un mensaje de alerta al usuario.

Por supuesto, este es solo un ejemplo de cómo manejar los errores en una aplicación de CRUD con React Hooks y Axios. La forma en que manejes los errores dependerá de tus necesidades específicas. Sin embargo, esperamos que este artículo te haya dado una idea de cómo puedes manejar los errores en tu propia aplicación.

Manejar los errores de manera adecuada es crucial para garantizar una buena experiencia de usuario en nuestras aplicaciones. Con los ejemplos y técnicas mencionadas en este artículo, podrás manejar fácilmente los errores y mensajes de alerta en tu propia aplicación de CRUD con React Hooks y Axios.

Otros Artículos