Alex Leonardo Rodriguez Carvajal
Engel Reyes
Jhon Eduard Bocanegra Ortiz
Juan Camilo Lentino Villalba
Sylvester Josué Rojas Cañón
Seba Cardoso
Seba Cardoso
Estiven Mahecha Henao
German Cavani
Miguel Angel Reyes Moreno
Geovanny Sneyder Paez Pabon
Moises Hernandez
Harold Zurita Simon
N40 M10
Cayo Legal
Wladimir Rocha
LUIS PALACIOS
Mariangelica Useche
Team PlatziSebastian Carballo
Víctor Samuel Mosquera Artamonov
Andrés Felipe Eslava Zuluaga
Max Andy Diaz Neyra
Andrés Felipe Eslava Zuluaga
Like si tambien te encanta Redux Toolkit 💚
Para los que usan y tienen instalado el pluggin de VSCode ES7+ React/Redux/React-Native snippets
existe un snippets que te da un template para los slices
rxslice
Saludos 👋
Redux toolkit es genial Aca tienes el enlace a la documentación oficial: https://redux-toolkit.js.org/tutorials/quick-start
npm install @reduxjs/toolkit
Like si te gusta como dicta la Profe el curso <3
Yo amo Redux Toolkit. Lo uso react-query y es lo mas.
Si, react-query es independiente como lo es redux. Lo que hace redux-toolkit es darte unos boilerplates. React-query te sirve para guardar en cache las peticiones fetch. https://platzi.com/tutoriales/2118-react-hooks/9281-que-es-react-query-y-para-que-usarlo-mi-libreria-favorita-en-mucho-tiempo
Redux Toolkit es tan hermoso jajaja...
Me sumo al amor por redux toolkit jajajaj
Creo que se ha facilitado mucho el código con Redux-toolkit.
Crear un Slice con redux-toolkit
primero se instala redux-toolkit
npm i @reduxjs/toolkit
creamos carpeta Slice/dataSlice.jsx
import { createSlice } from "@reduxjs/toolkit"; const initialState = { pokemons: [], loading: true, }; export const dataSlice = createSlice({ name: "data", initialState, reducers: { setPokemons: (state, action) => { state.pokemons = action.payload; state.loading=false }, setFavorite: (state, action) => { const indexPkmn = state.pokemons.findIndex( (pkmn) => pkmn.id == action.payload.id ); if (indexPkmn >= 0) { state.pokemons[indexPkmn].isFavorite = !state.pokemons[indexPkmn].isFavorite; } }, }, }); export const {setFavorite,setPokemons}= dataSlice.actions console.log('dataSlice.actions: ', dataSlice.actions); //exportamos por default los reducer del objeto dataSlice para integrarlos en la //raiz que integra todos nuestros reducers export default dataSlice.reducer
ahora pasaremos a pasar nustro slice a la raiz de nuestros reducer
rootReducer.jsx
import {combineReducers} from 'redux'; import { uiReducer } from './iu'; import { pokemonsReducer } from './pokemons'; import dataReducer from '../slices/dataSlice'; //como estamos utilicemmos la libreria de immutable, para // user reducer combinados, necesitamos instalar redux-immutable const rootReducer= combineReducers({ data:dataReducer // ui: uiReducer }) export default rootReducer;
redux-toolkit es amor
⚙️ Mejorando Redux con Redux Toolkit (RTK)
Hasta ahora aprendimos que para manejar nuestros pedacitos de estado en Redux necesitamos:
El problema es que Redux clásico genera demasiado boilerplate, tiene una curva de aprendizaje más elevada, y muchas veces necesitamos instalar múltiples paquetes para poder trabajar correctamente.
🚀 ¿Por qué Redux Toolkit?
Redux Toolkit (RTK) nace para mejorar la experiencia del desarrollador.
Sus ventajas principales:
Es decir, Redux Toolkit hace el trabajo pesado por nosotros 💪.
📦 Instalación
npm i @reduxjs/toolkit
🍰 Creando un Slice
Creamos una carpeta slices/ y dentro un archivo dataSlice.js.
Con RTK usamos createSlice, que recibe:
name: nombre del sliceinitialState: estado inicialreducers: un objeto donde cada propiedad es un reducer + action creator al mismo tiempo👉 Ya no usamos switch/case.
👉 Ya no importamos action types, RTK los genera automáticamente siguiendo el patrón:
/<nombre_del_reducer>, por ejemplo:
data/setPokemons.
Además, gracias a ImmerJS, podemos mutar el state directamente sin romper la inmutabilidad. RTK se encarga de todo.
🧠 Nuestro dataSlice.js
import { createSlice } from "@reduxjs/toolkit"; const initialState = { pokemons: [], }; export const dataSlice = createSlice({ name: "data", initialState, reducers: { setPokemons: (state, action) => { state.pokemons = action.payload; }, setFavorite: (state, action) => { const currentPokemonIndex = state.pokemons.findIndex( (pokemon) => pokemon.id === action.payload.pokemonId ); if (currentPokemonIndex >= 0) { const isFavorite = state.pokemons[currentPokemonIndex].favorite; state.pokemons[currentPokemonIndex].favorite = !isFavorite; } }, }, }); export const { setFavorite, setPokemons } = dataSlice.actions; console.log("DataSlice", dataSlice); export default dataSlice.reducer;
📝 Notas importantes
setPokemons asigna directamente.setFavorite accede y modifica sin get ni setIn.🧱 Root Reducer con Redux Toolkit
Ya no necesitamos redux-immutable ni estructuras especiales.
Volvemos al combineReducers tradicional de Redux.
import { combineReducers } from "redux"; import dataReducer from "../slices/dataSlice"; const rootReducer = combineReducers({ data: dataReducer, }); export default rootReducer;
Caramba!! Ahora sí se entiende que pidan redux en varios puestos, como en paypal, aunque para ser empresas extranjeras en latam pagan muy poco, aunque puede que yo malinterpretara la moneda en la que pagan, en caso de que se pague en dólares si que vale la pena aprender redux a fondo y redux toolkit lo facilita mucho.
Me parece que dataSlice no tiene un atributo llamado actions, solo vi el name, initialState y los reducers
Yo ando viendo el curso porque se me habia perdido cuando salió, en ese proceso ví redux toolkit de one y cuando vine a este solo me preguntaba porque tanto boilerplat, si esto lo monté fácil
Cual es el tema para que que el mayor e igual, se vea como un unico simbolo, como en el vscode de la profesora?
Es una fuente, no un tema. Se llama fira code. Hay un tutorial de cómo agregarlo a tu editor. Saludos.
English version branch & commit
Branch name
feat/redux-toolkit-migration
Commit message
"feat: Migrate to Redux Toolkit for state management
This commit migrates the application's state management from Redux with ImmutableJS to Redux Toolkit.
Implemented the first slice 'src/slices/dataSlice.js' to manage pokemon data."
Mejor usando la funcion map:
state.pokemons = state.pokemons.map((pokemon) => { if (pokemon.id === action.payload.pokemonId) { pokemon.favorite = !pokemon.favorite; return pokemon; } return pokemon });
Convención de los types: nombre_slice/nombre_action_creator . Esto lo hace RTK por defecto, sin embargo es bueno saberlo
Dejo mi dataSilice con TS:
import { createSlice } from "@reduxjs/toolkit"; import { PokemonDetailType } from "../api"; type InitialState = { pokemons: PokemonDetailType[] } const initialState: InitialState = { pokemons: [] } export const dataSlice = createSlice({ name: 'data', initialState, reducers:{ setPokemons: (state,action)=>{ state.pokemons = action.payload }, setFavorite: (state, action)=>{ const currentPokemonIndex = state.pokemons.findIndex( (pkmn:PokemonDetailType) => { return pkmn.id === action.payload.pokemonId } ) if(currentPokemonIndex >= 0){ const isFavorite = state.pokemons[currentPokemonIndex].favorite state.pokemons[currentPokemonIndex].favorite = !isFavorite } } } }) export const { setPokemons, setFavorite } = dataSlice.actions;
ME alegra saber que durante el curso viniste haciendo todo con TS. Realmente es un reto, puesto que Redux mismo sugiere no hacer el uso de Vanilla Redux con TS (ppor el tema del tipado y demás cosas) y en vez se use RTK.
C'=