Una de las mayores problemáticas de React es la forma en que se administran los estados y como los cambios pueden afectar a otros componentes. React propaga los cambios entre sus componentes de arriba-abajo y de abajo-arriba, es decir, un componente solo se puede comunicar con sus hijos directos y con su padre.
Redux es una herramienta que nos ayuda a gestionar la forma en que accedemos y actualizamos el estado de la aplicación de una forma centralizada y controlada. Mediante Redux es posible centralizar el estado general de la aplicación en algo llamado store, liberando a los componentes la responsabilidad de administrar un estado interno.
Redux ya no es tan fundamental debido a las actualizaciones de React y el uso de su Context API. React Context API puede ser una buena solución cuando lo que necesitas es una simple gestión de estados. Pero debes recordar que el propósito de Redux es el de gestionar el estado de una aplicación, mientras que el de Context es pasar propiedades.
npm install @reduxjs/toolkit react-redux
# Redux + Plain JS template
npx create-react-app my-app --template redux
# Redux + TypeScript template
npx create-react-app my-app --template redux-typescript
Store central donde se almacenará el estado global de la aplicación.
import { configureStore } from '@reduxjs/toolkit'
export const store = configureStore({
reducer: {},
})
Componente que contiene a toda la aplicacion para que este sea el encargado de gestionar los estados.
// Redux import { store } from './app/store' import { Provider } from 'react-redux'
ReactDOM.createRoot(document.getElementById('root')).render(
<React.StrictMode>
---
## **Crear Estado**
Los reducers son la forma en la cual se podrá modificar el estado de la store. Se puede contrastar con el setState en los estados de react.
> Se recomienda crear los Reducers en **src/features/carpeta**
Posteriormente desde esa ruta se pueden crear carpetas segun el contexto de funcionalidad. <br>
**En este proyecto se creó la carpeta tasks/taskSlice.js**
1. Dentro del archivo correspondiente se debe agregar el Slice:
```Javascript
import { createSlice } from '@reduxjs/toolkit'
export const taskSlice = createSlice({
name: 'tasks',
initialState:[],
reducers: {
}
})
export default taskSlice.reducer
export const store = configureStore({ reducer: { tasks: taskReducer }, })
---
## **Desde los componentes**
Importar el useDispatch o useSelector
- **useDispatch** es para hacer algo
- **useSelector** es para traer algo
``` javascript
import {useSelector} from 'react-redux'
import {useDispatch} from 'react-redux'
Se utiliza el useSelector
import {useSelector} from 'react-redux';
function App() {
//Desde la store obtener el estado de las tareas
const taskState = useSelector(state => state.tasks)
return (
<div className="App">
<p>Hola Mundo</p>
</div>
)
}
export default App
Desde taskSlice.js, se agrega el reducer, el cual es una función que recibel el state actual y un action.
export const taskSlice = createSlice({
name: 'tasks',
initialState,
reducers: {
addTask: (state,action) => {
state.push(action.payload)
}
}
})
Se exportan los reducers que se deseen al final del script
//Se exporta el reducer y el estado Tasks
export const {addTask} = taskSlice.actions
export default taskSlice.reducer
Se utiliza el useDispatch, se importa junto al reducer que se requiera
//Para usar un reducer, disparar eventos
import { useDispatch } from "react-redux"
import { addTask } from '../features/tasks/taskSlice'
Para ejecutar el cambio en el state:
//Se importa el useDispatch como si fuera un hook en la parte superior
const dispatch = useDispatch();
//El parametro en addTask es conocido como payload
dispatch(addTask(task));
npm install uuid
Importar
//V4 es uno de los estandar de id
import {v4 as uuid} from 'uuid';
Generar un ID único
const id = uuid();
Desde el proyecto con react establecido:
npm install react-router-dom@6
//Se importa React router en el componente App
import { BrowserRouter, Routes, Route } from 'react-router-dom';
...
//Se envuelven los componentes a cargar por rutas en las siguientes etiquetas:
<BrowserRouter>
<Routes>
{/* Componente que se carga por defecto ruta raíz */}
<Route path='/' element={<Componente1 />} />
{/* Componente que carga en la url/component2 */}
<Route path='/component2' element={<Componente2 />}/>
</Routes>
</BrowserRouter>
Importar Link para navegar al pulsar sobre ciertos elementos, es la alternativa sin anchor <*a*> para evitar el refresh de la página.
import {Link} from 'react-router-dom';
...
// Colocar la etiqueta Link para la redireccion al darle click al elemento
<Link to='/ruta'> Ir a la ruta </Link>
Importar el hook useNavigate para navegar en un momento dado con JavaScript
import {useNavigate} from 'react-router-dom';
...
// Establecemos el hook en el componente deseado
const navigate = useNavigate();
...
// Para redireccionar a una ruta
navigate('/componente2');
Se utiliza el hook useParams
import {useParams} from 'react-router-dom';
...
// Para obtener un objeto con los parametros de la url
const params = useParams();