Compartir en Twitter
Go to Homepage

IMPLEMENTACIÓN AVANZADA DE REDUX EN REACTJS CON EJEMPLOS PRÁCTICOS

August 20, 2025

Introducción a la gestión de estado con Redux en ReactJS

En el ámbito del desarrollo frontend con Redux, manejar el estado de manera eficiente es crucial para construir aplicaciones robustas y escalables. ReactJS facilita la creación de interfaces mediante componentes reutilizables, pero a medida que la complejidad crece, la gestión estado aplicaciones react se vuelve un desafío. Redux surge como una solución para centralizar y controlar el estado de forma predecible.

Redux es una biblioteca de JavaScript que implementa un store global donde se almacena el estado de la aplicación. Este enfoque permite que cualquier componente pueda acceder y modificar el estado de manera controlada, siguiendo un flujo unidireccional de datos que mejora la mantenibilidad y el rendimiento.

La arquitectura de Redux se basa en el patrón Flux, que garantiza que los datos fluyan desde la vista hacia el store y de regreso, pasando por acciones y reducers que actualizan el estado de forma inmutable y predecible.

Para iniciar con Redux, se importa la función createStore:

import { createStore } from "redux";

Posteriormente, se crea el store pasando un reducer, que es la función encargada de definir cómo cambia el estado ante cada acción:

const store = createStore(reducer);

El reducer recibe el estado actual y una acción, retornando el nuevo estado actualizado. Para interactuar con el store, se utilizan métodos como dispatch para enviar acciones, getState para obtener el estado actual y subscribe para reaccionar a cambios.

Creación y configuración del store en Redux

El store global es el núcleo de Redux, donde se mantiene el estado centralizado. Su correcta configuración es esencial para una optimizacion rendimiento aplicaciones web y un flujo de datos eficiente.

Primero, se instala Redux en el proyecto:

npm install redux

Luego, se define el estado inicial y el reducer que manejará las acciones. Por ejemplo, para un contador básico:

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;
    }
}

Con el reducer definido, se crea el store:

const store = createStore(rootReducer);

Para acceder al estado:

console.log(store.getState());

Y para escuchar cambios en el estado:

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

Este patrón facilita una gestión estado aplicaciones react clara y estructurada, ideal para proyectos que requieren escalabilidad y mantenimiento.

Integración de Redux con componentes React

Para conectar Redux con React, se utiliza la librería react-redux, que provee herramientas para vincular el store con la interfaz de usuario.

Primero, se instala la librería:

npm install react-redux

Se crea un archivo store.js para definir el store:

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

const store = createStore(rootReducer);

export default store;

La conexión entre el store y los componentes se realiza con la función connect, que recibe dos funciones: mapStateToProps para mapear el estado a las props, y mapDispatchToProps para mapear las acciones.

Ejemplo de mapStateToProps:

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

Ejemplo de mapDispatchToProps:

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

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

El componente conectado puede usar estas props para mostrar datos y disparar acciones:

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

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

Finalmente, se envuelve la aplicación con el Provider para que el store esté disponible en todos 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")
);

Esta integración contribuye a una arquitectura software react redux eficiente y modular.

Uso de React Hooks para una integración moderna

Con la introducción de React Hooks, la integración con Redux se ha simplificado notablemente. Usando useSelector y useDispatch, los componentes funcionales pueden acceder al estado y enviar acciones sin necesidad de connect.

Ejemplo:

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

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;

Esta metodología aprovecha los react hooks redux para una gestión de estado más intuitiva y eficiente.

Ejemplo práctico: aplicación de tareas con Redux

Para ejemplificar la aplicación de Redux, consideremos una app de tareas. La estructura incluye carpetas para acciones y reducers, y archivos para tipos, acciones y reducers.

Definición de tipos en types.js:

export const ADD_TASK = "ADD_TASK";
export const DELETE_TASK = "DELETE_TASK";

Acciones en 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,
});

Reducer en 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;

Store en store.js:

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

const store = createStore(taskReducer);

export default store;

Componente principal 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;

Este ejemplo demuestra cómo redux reactjs facilita la gestión del estado global, permitiendo agregar y eliminar tareas de forma sencilla y eficiente.

Conclusiones

La adopción de Redux en proyectos con ReactJS es esencial para lograr una gestión estado aplicaciones react robusta y escalable. Su arquitectura basada en un store global y un flujo unidireccional de datos garantiza un código organizado y predecible.

La integración con React, ya sea mediante connect o los modernos react hooks redux, simplifica la conexión entre el estado global y los componentes, mejorando la mantenibilidad y el rendimiento.

Los ejemplos prácticos evidencian que, aunque la configuración inicial pueda parecer compleja, Redux optimiza el manejo de estados en aplicaciones grandes, facilitando el desarrollo de frontend escalable y eficiente.

Incorporar estas técnicas en tus proyectos potenciará tu capacidad para crear aplicaciones web modernas, organizadas y fáciles de mantener, consolidando tu experiencia en el ecosistema React.