Redux y su uso.
El uso de redux tiene un flujo del tipo WebComponent -> Acción -> Reductor -> Estado
y su uso a manera práctica es:
Acciones (Actions)
Definición de las acciones
Primero se definen las acciones:
const ADD_ELEMENTO = 'ADD_ELEMENTO'
Generadores de Acciones
Enseguida los generadores de acciones que retornan un objeto con el tipo de acción y/o datos adicionales, también se pueden omitir las definiciones de las acciones si estas se incluyen a manera de cadena de texto en el generador de acción:
agregarElemento = (datos) => ({type: ADD_ELEMENTO, payload: datos})
Reductores (Reducers)
Después vienen los reducers, que reciben acciones y alteran el estado y siempre reciben como argumento estado y acción:
reducer = (state = initialState, action) => {
switch(actiopn.type){
case ADD_ELEMENTO:
return {
stateProperty: stateOriginal + cosas a realizar
}
default:
return state;
}
}
Unión de reducers
Combinar reducers en caso de que haya mas de uno
export default combineReducers({
reducer1,
reducer2,
...
})
Creación de la "Store"
Se crea una "store" que almacena el estado y recibe un reducer como parámetro:
import {createStore} from 'redux'
const store = createStore(reducer);
Pasos adicionales
Si hay mas de un reducer:
import rootReducer from './reducers';
const store = createStore(rootReducer)
Observar cambios del estado en la "Store
Para monitorear los cambios a los estados se pude "suscribir a la store":
const unsuscribe = store.suscribe(() => {
acciones a realizar al cambiar el estado de la store
console.log(store.getState())
})
Redux con React
Para usar redux con React sem realizan lo siguiente:
Importar react-redux
import {Provider} from 'react-redux'
Envolver un componente con el provider con la store como "Prop"
<Provider store={store}>
<App />
</Provider>
"Mappear" estado y reducers para ser usados en el actual componente:
const mapStateToProps = (state) => {
operacionsConElState...
...
return {
stateProperty: statePropertyValue
}
}
const mapDispatchToProps = (dispatch) => {
funcionQueActualizaElEstado(state){
dispatch({
type: ACTION,
state
})
}
}
"Connectar" redux con react, se conenctan solo el estado y las acciones a despachar en el actual componente:
import {connect} from 'react-redux'
export default connect(
mapStateToProps,
mapDispatchToProps
)(Componente);
Despachar eventos en algún componente:
import {store} from 'redux';
<Component onClick={() => store.dispatch(agregarElemento(datos))}