Redux React
Redux React
Necesitamos una librería especial que conecte React con Redux. Vamos a utilizar ciertos
componentes de una librería que se llama React-Redux.
ATENCION: los nombres de las acciones y las funciones que contienen las acciones como
objeto y también el reducer, lo más común es que estén en archivos separados!!!
Quedaría así:
return {
type: INCREMENTO,
const initialState = {
count: 0
switch(action.type){
case INCREMENT : return{ …state, count: state count +1}
reactDOM.render(
<React.StrictMode>
<App/>
</Provider>
Existe una función llamada ‘mapStateToProp’ que lo que va a hacer es recibir todo el estado
global como parámetro y devolver un objeto que contenga solo una de las propiedades de ese
estado, suponiendo que el estado global tenga más de un parámetro. Supongamos que yo
quiero usar ese estado dentro de algún componente de React, ¿Cómo hago? Tengo que
importar {connect} from ‘react-redux’, utilizo el estado en el componente: por ejemplo
return {
<div>
<header>
</div>
function mapStateToProps(State){
return{
count: state.count,
Los connect solo se usan si el componente requiere utilizar alguna propiedad del estado global,
no es obligatorio usarlo.
Todo esto sería como subscribir el componente a el estado global. Atiende a los cambios del
estado y los utiliza dentro del componente.
¿Pero que pasa si en mi componente quiero tener un botón que despache acciones para
cambiar el estado global?
Bueno, tengo dos opciones. La primera es importar la acción, en este caso {increment} de la
carpeta donde la tengamos, en este caso en la misma store, from ‘/.store’ (en realidad lo más
común es que esté guardado en un archivo ‘actions.js’) y usarlo en el botón con la propiedad
onClick . Al usar connect tengo el método dispatch de la store incluido para usar en el evento
del botón. Por lo que directamente lo usamos así:
Esto funcionaría porque el connect que importamos inyecta a las props el método dispatch
que adquiere de la store.
Entonces, entedemos que ‘connect’ tiene dos argumentos, una donde traemos las
propiedades del estado global, para “subscribirnos” a esos estados, y otro donde podemos
importar acciones para despacharlas. Tenemos subscribe y dispatch en connect.
Pero ¿Qué pasa si tenemos un componente que no quiere recibir las props del estado global,
sino que solamente quiere despachar acciones?
Muy simple:
Definimos el argumento de propiedades que no las necesitamos colocando ‘null’, y nos queda
solo las acciones que queremos despachar.
Se muestra otra manera de hacer el dispatch SOLO en componentes funcionales, sin usar
connect y usando hooks. Esta manera no se hace mucho por lo que en caso de necesitarla, se
describe en la lecture del M2-12 cohorte 16-a minuto 38:54. SOLO EN EL REMOTO CASO DE
QUE LO PIDAN EN EL CP. En el mismo video en el minuto 40:45 también se describe una forma
de obtener las propiedades del estado global sin connect SOLO en componentes funcionales
(no de clase, aunque ¿quien usa clase….?) Eso es un poco más interesante porque ahorra
código. OJO con lo que hay que importar para que funcionen los hooks.
Ahora bien…
¿Qué pasa si tengo una store enorme con un montón de propiedades de estado global dentro?
¿Tengo que hacer un console.log de todo para saber qué tiene? No, tranqui.
Cuando nosotros creamos la store, como segundo argumento vamos a pasar la conexión a las
Redux Dev Tools:
);
Entonces, a la hora de inspeccionar una pagina (click derecho, inspeccionar) vamos a tener
además de la consola y todo lo otro, una pestaña llamada Redux en donde nos va a detallar
todas las propiedades que tiene el estado global y un historial de acciones que se hayan
ejecutado cambiando el estado. Incluso puedo ver como fueron los cambios que se realizaron
en cada acción del historial.
Otro tema. ¿Cómo conecto redux React a una API? Ya sea para obtener data o para ejecutar
acciones asíncronas.
¿Cómo la uso?
Primero la instalamos
Luego para combinar las dos cosas, vamos a tener que leer documentación, porque nadie se
acuerda como hacerlo de memoria.
Está explicado en la documentación de Redux DevTools, pero podemos volver a entrar al video
M2-12 cohorte 16a minuto 58:00 aprox
Entonces, para crear una acción asíncrona podemos hacer algo así: función que contiene el
objeto de la acción: En vez de retornar un objeto, retorno una función que dentro tenga el
setTimeOut
setTimeout ( ( ) => {
dispatch(increment ( ))
}, 1500);
}
Al la función devolver otra función y no un objeto, va a ser interceptado por redux thunk y va a
ejecutarse el setTimeout, va a esperar el tiempo y luego se ejecutará el dispatch.
rfce