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_TODOque elimini una tasca perid. - Modifica el reductor
todoReducerper 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
removeTodoActionCreatorque prengui unidcom 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
