Cómo aplicar Redux en ReactJS con ejemplos prácticos

Go to Homepage

Descubrimos el uso de Redux en ReactJS

Si eres un desarrollador de aplicaciones web y estás interesado en el desarrollo web frontend, debes haber oído hablar de React JS. React es un marco de trabajo popular y trata la interfaz de usuario como una función que produce vistas. Esto significa que React es una biblioteca simple y fácil de usar que hace que el desarrollo frontend sea muy fácil y eficiente.

Pero a medida que la aplicación se vuelve compleja, los datos se vuelven difíciles de manejar con el uso de solo React. Es aquí donde entra la ayuda de Redux.

Redux es una biblioteca de administración de estado de JavaScript que hace que el manejo de datos sea más fácil y más predecible para las aplicaciones. Ayuda en la gestión de datos en toda la aplicación y es especialmente útil para aplicaciones grandes. Como resultado, los desarrolladores pueden escribir aplicaciones web frontend altamente escalables y mantenibles.

En lugar de manejar el estado localmente, se hace a través de un único “store” centralizado. Cada componente puede acceder y actualizar los datos del estado y, en caso de un cambio, la actualización se propaga automáticamente al resto de la aplicación.

La arquitectura de Redux sigue el patrón de diseño Flux. Siguiendo este patrón, la aplicación sigue un flujo unidireccional. El flujo comienza desde el controlador de eventos de la vista, pasa a través del “intermediario”, luego al “almacenamiento” y finalmente a la vista. Este flujo unidireccional del patrón Flux reduce la complejidad del código y, por lo tanto, mejora la escalabilidad de la aplicación.

Para usar Redux en React, necesitamos adaptar la aplicación React a Redux. Primero, necesitamos importar Redux en nuestra aplicación React usando:

import { createStore } from "redux";

A continuación, podemos crear nuestro almacén “store”:

const store = createStore(reducer);

Aquí, “reducer” se refiere a una función que actualiza nuestros datos del estado actual. Este “reducer” se utiliza en el parámetro createStore del “store”.

Podemos acceder y actualizar los datos del estado utilizando las funciones de “dispatch” y “getState” y actualizando nuestra vista con la función “subscribe”.

El uso de Redux en React hace que la gestión de datos en aplicaciones web sea mucho más fácil. Ayuda en la creación de aplicaciones frontend escalables y mantenibles. Para que la aplicación React funcione con Redux, necesitamos importar Redux y crear el almacenamiento “store” con un “reducer”. Luego, podemos utilizar Redux para actualizar y acceder a los datos del estado de la aplicación. En definitiva, Redux es una herramienta indispensable para cualquier desarrollador de aplicaciones web frontend y es esencial para aplicaciones grandes. ¡Anímate a probarlo!

Aprendimos cómo generar un store en Redux

En este artículo, aprendimos cómo aplicar Redux en ReactJS con ejemplos prácticos. También aprendimos cómo generar un store en Redux para manejar el estado de nuestra aplicación.

La creación de un store en Redux es un paso importante para implementar el patrón de diseño Flux en nuestra aplicación ReactJS. Un store en Redux es donde se almacena el estado de nuestra aplicación, y toda la información relevante puede ser accedida y actualizada desde allí.

Inicialmente, necesitamos instalar Redux en nuestra aplicación. Para ello, utilizamos el siguiente comando en la terminal:

npm install redux

Después de instalar Redux, podemos crear nuestro store y definir su estructura. Primero, necesitamos importar la función createStore de Redux:

import { createStore } from "redux";

Luego, definimos nuestra estructura de store en una función denominada rootReducer. Es aquí donde manejamos todas las acciones que ocurren en nuestra aplicación y actualizamos el estado en consecuencia.

const initialState = {
    count: 0,
};

function rootReducer(state = initialState, action) {
    switch (action.type) {
        case "INCREMENT":
            return {
                count: state.count + 1,
            };
        case "DECREMENT":
            return {
                count: state.count - 1,
            };
        default:
            return state;
    }
}

En este ejemplo, hemos definido un estado inicial para nuestro store, donde la variable count se inicializa en 0. Luego, creamos una función rootReducer que maneja las acciones INCREMENT y DECREMENT para actualizar el estado en consecuencia.

Finalmente, podemos crear nuestro store utilizando la función createStore de Redux. Simplemente necesitamos pasar nuestra función rootReducer a la función createStore.

const store = createStore(rootReducer);

Ahora hemos creado nuestro store. Podemos acceder al estado de la aplicación utilizando la función getState en nuestro store.

console.log(store.getState());

También podemos subscribirnos a cualquier cambio en el store utilizando la función subscribe.

store.subscribe(() => {
    console.log(store.getState());
});

Aprender a generar un store en Redux es un paso importante para aplicar Redux en ReactJS. Un store en Redux es donde se almacena toda la información relevante de nuestra aplicación, y podemos manejar las acciones y actualizar el estado en consecuencia. A través de ejemplos prácticos, hemos aprendido cómo crear un store en Redux y cómo acceder y actualizar el estado de nuestra aplicación desde el store.

Implementamos Redux en componentes React

Una vez comprendidos los conceptos básicos de Redux y su arquitectura, es el momento de implementarlo en los componentes de ReactJS para poder lograr una mejor gestión y organización del estado.

Primero, es necesario instalar la librería react-redux que nos permitirá conectar nuestros componentes de React con el store de Redux. Para ello, se debe ejecutar el siguiente comando en la consola:

npm install react-redux

Una vez hecho esto, se debe crear un archivo store.js en la raíz del proyecto para definir el store de Redux:

import { createStore } from "redux";
import rootReducer from "./reducers";

const store = createStore(rootReducer);

export default store;

Es importante tener en cuenta que el archivo reducers.js debe contener todos los reducers que se vayan a utilizar en la aplicación.

Luego, se debe realizar la conexión entre el store y los componentes. Para ello, se debe utilizar la función connect de react-redux. Esta función recibe dos parámetros: una función mapStateToProps y una función mapDispatchToProps.

La función mapStateToProps permite relacionar las props del componente con el estado del store. Esta función recibe el estado actual del store como parámetro y devuelve un objeto con las props que se quieren pasar al componente:

const mapStateToProps = (state) => ({
    counter: state.counter,
});

En este ejemplo, se pasa la propiedad counter del estado de Redux como una prop más del componente:

const Counter = ({ counter }) => <h1>{counter}</h1>;

export default connect(mapStateToProps)(Counter);

La función mapDispatchToProps permite relacionar las acciones definidas en Redux con las props del componente. Esta función recibe la función dispatch como parámetro y devuelve un objeto con las acciones que se quieren pasar al componente:

const increment = () => ({ type: "INCREMENT" });

const mapDispatchToProps = (dispatch) => ({
    increment: () => dispatch(increment()),
});

En este ejemplo, se pasa la acción increment de Redux como una prop más del componente:

const Counter = ({ counter, increment }) => (
    <>
        <h1>{counter}</h1>
        <button onClick={increment}>Increment</button>
    </>
);

export default connect(mapStateToProps, mapDispatchToProps)(Counter);

Por último, se debe definir el Provider de Redux en el archivo principal de la aplicación para que éste pueda ser utilizado en los componentes:

import React from "react";
import ReactDOM from "react-dom";
import { Provider } from "react-redux";
import store from "./store";
import App from "./App";

ReactDOM.render(
    <Provider store={store}>
        <App />
    </Provider>,
    document.getElementById("root")
);

Con estos pasos, se puede utilizar Redux en los componentes de la aplicación de ReactJS de una manera sencilla y concreta. Recuerda que la clave para lograr una óptima organización del estado en tu aplicación es comprender las herramientas que utilizas y aplicarlas de manera eficiente. ¡Ponte a prueba e inténtalo en tu próximo proyecto!

Exploramos la integración de Redux con React Hooks

Si ya eres un desarrollador que trabaja con ReactJS, seguramente has escuchado hablar de Redux. Redux es una biblioteca de JavaScript para el manejo de estados, que se ha vuelto muy popular en los últimos años. En conjunto con React es muy poderoso, ya que permite la escalabilidad en aplicaciones grandes.

En la última versión de ReactJS se han introducido los React Hooks. Estos son una nueva característica que permite el manejo de estados y ciclos de vida de manera más sencilla y eficiente. Combina las funcionalidades de los componentes funcionales y los efectos de los componentes de clase.

Veamos cómo podemos integrar Redux con React Hooks:

1. Importar las librerías necesarias

Para comenzar, tenemos que importar las librerías que vamos a utilizar. Estas son React, ReactDOM, React-Redux y Redux.

import React from "react";
import ReactDOM from "react-dom";
import { Provider } from "react-redux";
import { createStore } from "redux";
import rootReducer from "./reducers/index";

2. Definir nuestro estado y acciones

Definimos nuestro estado inicial y nuestras acciones en un archivo llamado actions.js.

const initialState = {
    contador: 0,
};

export const incrementarContador = () => {
    return {
        type: "INCREMENTAR_CONTADOR",
    };
};

export const reducirContador = () => {
    return {
        type: "REDUCIR_CONTADOR",
    };
};

3. Crear el reducer

Creamos un archivo reducers/index.js donde definimos nuestro reducer.

const rootReducer = (state = initialState, action) => {
    switch (action.type) {
        case "INCREMENTAR_CONTADOR":
            return {
                ...state,
                contador: state.contador + 1,
            };
        case "REDUCIR_CONTADOR":
            return {
                ...state,
                contador: state.contador - 1,
            };
        default:
            return state;
    }
};

export default rootReducer;

4. Crear la store

Creamos la store, pasando como parámetro nuestro reducer.

const store = createStore(rootReducer);

5. Utilizar el Provider

Utilizamos el componente Provider de react-redux para proveer la store a nuestra aplicación.

ReactDOM.render(
    <Provider store={store}>
        <App />
    </Provider>,
    document.getElementById("root")
);

6. Utilizar los React Hooks

Por último, en nuestro componente podemos utilizar los React Hooks para conectar nuestro estado y acciones.

import React from "react";
import { useSelector, useDispatch } from "react-redux";
import { incrementarContador, reducirContador } from "./actions/index";

const App = () => {
    const contador = useSelector((state) => state.contador);
    const dispatch = useDispatch();

    return (
        <div>
            <h1>Contador: {contador}</h1>
            <button onClick={() => dispatch(incrementarContador())}>
                Incrementar
            </button>
            <button onClick={() => dispatch(reducirContador())}>Reducir</button>
        </div>
    );
};

export default App;

Como podemos ver, utilizamos los hooks useSelector y useDispatch para obtener nuestro estado y acciones respectivamente. Luego los utilizamos en nuestro componente para actualizar el estado.

La integración entre Redux y React Hooks es muy sencilla y nos permite hacer uso de los nuevos hooks en conjunto con el manejo de estados de Redux. De esta manera, podemos tener aplicaciones más escalables y sencillas de mantener.

Revisamos ejemplos prácticos de Redux en ReactJS

En esta sección revisaremos ejemplos prácticos de como aplicar Redux en ReactJS. Como lo mencionamos anteriormente, Redux es una biblioteca que se encarga de gestionar el estado completo de una aplicación en un objeto guardado en la memoria, llamado store.

A continuación, veremos un ejemplo de cómo gestionar el estado de una aplicación simple de tareas usando ReactJS y Redux. Lo primero que debemos hacer es crear una carpeta llamada “src” y dentro de ella crear otras dos carpetas llamadas “actions” y “reducers”. En la carpeta “src” crearemos también el archivo “index.js” y el archivo “store.js” donde guardaremos el estado global de la aplicación.

El siguiente paso es crear los archivos de las acciones y reducers de nuestra aplicación. En la carpeta “actions” crearemos un archivo llamado “types.js” donde definimos las acciones o eventos que pueden suceder en nuestra aplicación y que modificarán el estado de la misma. En nuestro ejemplo, definiremos las acciones de “agregar una tarea” y “eliminar una tarea”:

// types.js
export const ADD_TASK = "ADD_TASK";
export const DELETE_TASK = "DELETE_TASK";

Después de crear el archivo “types.js”, creamos un archivo en la carpeta “actions” llamado “taskActions.js” donde definimos las funciones que enviarán la acción a nuestros reducers.

// taskActions.js
import { ADD_TASK, DELETE_TASK } from "./types";

export const addTask = (task) => ({
    type: ADD_TASK,
    payload: task,
});

export const deleteTask = (taskId) => ({
    type: DELETE_TASK,
    payload: taskId,
});

En la carpeta “reducers” crearemos un archivo llamado “taskReducer.js” donde guardaremos el estado actual de nuestra aplicación y definimos las acciones que afectarán dicho estado.

// taskReducer.js
import { ADD_TASK, DELETE_TASK } from "../actions/types";

const initialState = {
    tasks: [],
};

const taskReducer = (state = initialState, action) => {
    switch (action.type) {
        case ADD_TASK:
            return {
                ...state,
                tasks: [...state.tasks, action.payload],
            };
        case DELETE_TASK:
            return {
                ...state,
                tasks: state.tasks.filter((task) => task.id !== action.payload),
            };
        default:
            return state;
    }
};

export default taskReducer;

Por último, en el archivo “store.js”, creamos nuestro store y le agregamos los reducers que hemos creado.

// store.js
import { createStore } from "redux";
import taskReducer from "./reducers/taskReducer";

const store = createStore(taskReducer);

export default store;

Con esto, hemos creado nuestra estructura básica de un proyecto Redux en ReactJS. Ahora, en nuestro componente principal “App.js”, podemos llamar nuestras acciones y nuestro estado usando “useSelector” y “useDispatch” como se muestra a continuación:

// App.js
import React from "react";
import { useSelector, useDispatch } from "react-redux";
import { addTask, deleteTask } from "./actions/taskActions";

function App() {
    const tasks = useSelector((state) => state.tasks);
    const dispatch = useDispatch();

    const handleAddTask = () => {
        dispatch(
            addTask({ id: tasks.length + 1, name: `Tarea ${tasks.length + 1}` })
        );
    };

    const handleDeleteTask = (taskId) => {
        dispatch(deleteTask(taskId));
    };

    return (
        <div>
            <button onClick={handleAddTask}>Agregar tarea</button>
            <ul>
                {tasks.map((task) => (
                    <li key={task.id}>
                        {task.name}
                        <button onClick={() => handleDeleteTask(task.id)}>
                            Eliminar tarea
                        </button>
                    </li>
                ))}
            </ul>
        </div>
    );
}

export default App;

Con esto, hemos creado una aplicación simple que usa Redux como gestor de estado para agregar y eliminar tareas. Como se puede observar, la estructura básica de Redux en ReactJS puede parecer un poco complicada al principio, pero una vez que se tiene una base sólida en su uso, es posible generar aplicaciones más complejas que requieran de un manejo de datos mucho más robusto.

Redux se encarga de gestionar el estado global de una aplicación en un objeto guardado en la memoria, llamado store, permitiendo que toda la aplicación tenga acceso a este estado y, por ende, pueda ser manipulado

Otros Artículos