Contenido del curso
Introducción a nuestro proyecto
¡Atraparlos ya!
React.js + Redux
Middlewares
Avanzando la ui
Inmutabilidad
Avanzado
Despedida del curso
useSelector y useDispatch vs connect en Redux
Resumen
Si ya conectaste un componente con connect, el siguiente paso natural es migrar al API de hooks de React Redux. Esta guía te muestra cómo reemplazar mapStateToProps y mapDispatchToProps por useSelector y useDispatch, por qué Redux recomienda esta forma y qué pierdes en el camino.
¿Qué diferencia hay entre connect y los hooks de Redux?
La diferencia más visible es la cantidad de boilerplate. Con connect tuviste que crear mapStateToProps, mapDispatchToProps y envolver el componente en un wrapper. Con hooks haces lo mismo en dos líneas.
Pero hay un trade-off que conviene tener claro antes de migrar:
- Separación de responsabilidades:
connectgana, porque crea un higher-order component que renderiza tu componente y le pasa estado y actions por props. - Testing: con
connectes más simple, ya que solo necesitas enviar props simuladas. Con hooks debes conectar el componente a Redux antes de poder testearlo. - Experiencia de desarrollo: los hooks ganan por menos código, ciclo de vida de la data más claro y mejor compatibilidad con TypeScript.
¿Por qué Redux recomienda usar hooks en lugar de connect? Porque ofrecen menos boilerplate, un flujo de datos más fácil de entender y mejor integración con TypeScript. La contrapartida es que el testing requiere conectar el componente al store.
¿Para qué sirven useSelector y useDispatch?
Son los dos hooks principales del API y cubren lo que antes hacías con connect.
Cómo funciona useSelector
useSelector extrae datos del estado a través de una función selectora. Esa función debe ser pura, es decir, no depender de variables externas. Es el equivalente directo de mapStateToProps, con una diferencia clave: el valor se guarda en una variable, no llega por props.
El selector también suscribe el componente al estado. Cada vez que se hace dispatch de una acción, Redux lo ejecuta para evaluar si el valor cambió y decidir si rerenderiza o no el componente.
Cómo funciona useDispatch
useDispatch retorna una referencia al dispatcher del store de Redux. Con esa referencia disparas tus acciones directamente, sin pasar por props ni necesitar mapDispatchToProps.
¿Qué reemplaza useSelector y useDispatch del enfoque con connect?
useSelectorreemplaza amapStateToPropsyuseDispatchreemplaza amapDispatchToProps, eliminando el wrapper del componente.
¿Cómo migrar un componente de connect a hooks paso a paso?
La migración es bastante directa si sigues el orden correcto. Estos son los cambios que aplicas sobre el componente que ya tenías conectado.
- Eliminar los parámetros que recibías por props desde
connect. - Borrar
mapStateToProps,mapDispatchToPropsy el wrapper delexport. - Limpiar imports que ya no usas y dejar la acción con su nombre original, sin renombrar.
- Importar
useSelectoryuseDispatchdesdereact-redux. - Obtener los datos del estado con el selector y guardar la referencia del dispatcher.
- Disparar las acciones llamando al dispatcher con la acción como argumento.
En código, el resultado se ve así:
javascript import { useSelector, useDispatch } from 'react-redux'; import { setPokemons } from './actions';
const pokemons = useSelector(state => state.pokemons); const dispatch = useDispatch();
dispatch(setPokemons(data));
Al recargar el navegador, la lista de pokemons sigue apareciendo igual que antes. Lo que antes te tomaba varios bloques de código ahora vive en dos líneas.
Conceptos y habilidades que trabajamos en la clase
Algunos términos que aparecen en la migración valen una explicación corta para que los uses con seguridad.
- Boilerplate: código repetitivo que necesitas escribir para que algo funcione, aunque no aporta lógica de negocio. Se menciona al inicio de la clase como la principal carga de
connect. - Higher-order component: componente que envuelve a otro y le inyecta props. Es lo que
connectcrea por debajo. - Función pura: función que, con los mismos argumentos, siempre retorna el mismo valor y no depende de variables externas. Es un requisito del selector que pasas a
useSelector. - Suscripción al estado: mecanismo por el que el selector se vuelve a ejecutar tras cada dispatch para decidir si rerenderiza el componente.
- Dispatcher: función que dispara acciones contra el store.
useDispatchte da una referencia a ella.
Si ya tienes un proyecto con connect, intenta migrar un componente siguiendo estos pasos y cuéntame en los comentarios qué parte te resultó más confusa o qué descubriste al comparar ambos enfoques.