En aquest tema, explorarem dos conceptes fonamentals de Redux: les accions i els reductors. Aquests elements són essencials per gestionar l'estat de l'aplicació de manera previsible i estructurada.
Què són les accions?
Les accions són objectes JavaScript que contenen informació sobre un esdeveniment que ha ocorregut i que pot canviar l'estat de l'aplicació. Cada acció ha de tenir una propietat type
que descrigui el tipus d'esdeveniment, i pot tenir altres propietats que proporcionin informació addicional necessària per actualitzar l'estat.
Exemple d'una acció
En aquest exemple, l'acció addTodoAction
té un tipus ADD_TODO
i un payload
que conté les dades necessàries per afegir una nova tasca.
Creadores d'accions
Les creadores d'accions són funcions que creen i retornen accions. Són útils per evitar la duplicació de codi i per fer que el codi sigui més llegible i mantenible.
function addTodoActionCreator(id, text) { return { type: 'ADD_TODO', payload: { id, text } }; } // Ús de la creadora d'accions const action = addTodoActionCreator(1, 'Aprendre Redux');
Què són els reductors?
Els reductors són funcions pures que prenen l'estat actual i una acció com a arguments, i retornen un nou estat. Els reductors especifiquen com l'estat de l'aplicació ha de canviar en resposta a una acció.
Exemple d'un reductor
const initialState = { todos: [] }; function todoReducer(state = initialState, action) { switch (action.type) { case 'ADD_TODO': return { ...state, todos: [...state.todos, action.payload] }; default: return state; } }
En aquest exemple, el reductor todoReducer
gestiona l'estat de les tasques (todos
). Quan rep una acció de tipus ADD_TODO
, afegeix una nova tasca a la llista de tasques.
Integració d'accions i reductors amb Redux
Per utilitzar accions i reductors amb Redux, primer hem de crear un store
que emmagatzemi l'estat de l'aplicació. Utilitzarem la funció createStore
de Redux per fer-ho.
Exemple complet
import { createStore } from 'redux'; // Estat inicial const initialState = { todos: [] }; // Reductor function todoReducer(state = initialState, action) { switch (action.type) { case 'ADD_TODO': return { ...state, todos: [...state.todos, action.payload] }; default: return state; } } // Crear el store const store = createStore(todoReducer); // Crear una acció const addTodoAction = { type: 'ADD_TODO', payload: { id: 1, text: 'Aprendre Redux' } }; // Despatxar l'acció store.dispatch(addTodoAction); // Obtenir l'estat actualitzat console.log(store.getState());
En aquest exemple, hem creat un store
amb el reductor todoReducer
, hem creat una acció addTodoAction
i l'hem despatxat al store
. Finalment, hem obtingut l'estat actualitzat del store
.
Exercicis pràctics
Exercici 1: Crear una acció i un reductor
- Crea una acció
REMOVE_TODO
que elimini una tasca perid
. - Modifica el reductor
todoReducer
per gestionar l'accióREMOVE_TODO
.
Solució
// Acció REMOVE_TODO const removeTodoAction = { type: 'REMOVE_TODO', payload: { id: 1 } }; // Modificar el reductor function todoReducer(state = initialState, action) { switch (action.type) { case 'ADD_TODO': return { ...state, todos: [...state.todos, action.payload] }; case 'REMOVE_TODO': return { ...state, todos: state.todos.filter(todo => todo.id !== action.payload.id) }; default: return state; } }
Exercici 2: Crear una creadora d'accions
- Crea una creadora d'accions
removeTodoActionCreator
que prengui unid
com a argument i retorni una accióREMOVE_TODO
.
Solució
function removeTodoActionCreator(id) { return { type: 'REMOVE_TODO', payload: { id } }; } // Ús de la creadora d'accions const action = removeTodoActionCreator(1);
Conclusió
En aquesta secció, hem après què són les accions i els reductors en Redux, com crear-los i com integrar-los amb el store
de Redux. També hem practicat la creació d'accions i reductors amb exercicis pràctics. Amb aquests coneixements, estem preparats per gestionar l'estat de les nostres aplicacions de manera més eficient i estructurada.
Curs de React
Mòdul 1: Introducció a React
- Què és React?
- Configuració de l'entorn de desenvolupament
- Hola Món en React
- JSX: Extensió de la sintaxi de JavaScript
Mòdul 2: Components de React
- Comprendre els components
- Components funcionals vs components de classe
- Props: Passar dades als components
- State: Gestionar l'estat del component
Mòdul 3: Treballar amb esdeveniments
- Gestionar esdeveniments en React
- Renderització condicional
- Llistes i claus
- Formularis i components controlats
Mòdul 4: Conceptes avançats de components
- Elevar l'estat
- Composició vs herència
- Mètodes del cicle de vida de React
- Hooks: Introducció i ús bàsic
Mòdul 5: Hooks de React
Mòdul 6: Enrutament en React
Mòdul 7: Gestió de l'estat
- Introducció a la gestió de l'estat
- API de context
- Redux: Introducció i configuració
- Redux: Accions i reductors
- Redux: Connexió amb React
Mòdul 8: Optimització del rendiment
- Tècniques d'optimització del rendiment de React
- Memorització amb React.memo
- Hooks useMemo i useCallback
- Divisió de codi i càrrega mandrosa
Mòdul 9: Proves en React
- Introducció a les proves
- Proves unitàries amb Jest
- Proves de components amb React Testing Library
- Proves de punta a punta amb Cypress
Mòdul 10: Temes avançats
- Renderització del costat del servidor (SSR) amb Next.js
- Generació de llocs estàtics (SSG) amb Next.js
- TypeScript amb React
- React Native: Construir aplicacions mòbils