Introducció a Redux
Redux és una llibreria de gestió d'estat per a aplicacions JavaScript, especialment útil quan es treballa amb frameworks com React. Proporciona una manera previsible de gestionar l'estat de l'aplicació amb un únic "store" centralitzat.
Conceptes Clau de Redux
- Store: L'únic lloc on es guarda l'estat de l'aplicació.
- Actions: Objectes que descriuen el que ha passat. Tenen un tipus i, opcionalment, una càrrega de dades.
- Reducers: Funcions pures que especifiquen com canvia l'estat de l'aplicació en resposta a una acció.
- Dispatch: Mètode per enviar accions al store.
- Selectors: Funcions per obtenir dades del store.
Instal·lació de Redux
Per començar a utilitzar Redux en una aplicació React, primer cal instal·lar les dependències necessàries:
Creació del Store
El store és l'únic lloc on es guarda l'estat de l'aplicació. Es crea utilitzant la funció createStore
de Redux.
import { createStore } from 'redux'; // Un reducer simple const initialState = { count: 0 }; function counterReducer(state = initialState, action) { switch (action.type) { case 'INCREMENT': return { count: state.count + 1 }; case 'DECREMENT': return { count: state.count - 1 }; default: return state; } } // Creació del store const store = createStore(counterReducer);
Accions
Les accions són objectes que descriuen el que ha passat a l'aplicació. Tenen un tipus i, opcionalment, una càrrega de dades.
Dispatching Accions
Per enviar una acció al store, utilitzem el mètode dispatch
.
Connectar Redux amb React
Per connectar Redux amb React, utilitzem el paquet react-redux
. El component Provider
fa que el store estigui disponible per a tots els components de l'aplicació.
import React from 'react'; import ReactDOM from 'react-dom'; import { Provider } from 'react-redux'; import App from './App'; import { store } from './store'; ReactDOM.render( <Provider store={store}> <App /> </Provider>, document.getElementById('root') );
Utilitzar Redux en Components React
Per utilitzar l'estat de Redux en components React, utilitzem els hooks useSelector
i useDispatch
de react-redux
.
import React from 'react'; import { useSelector, useDispatch } from 'react-redux'; const Counter = () => { const count = useSelector((state) => state.count); const dispatch = useDispatch(); return ( <div> <p>Count: {count}</p> <button onClick={() => dispatch({ type: 'INCREMENT' })}>Increment</button> <button onClick={() => dispatch({ type: 'DECREMENT' })}>Decrement</button> </div> ); }; export default Counter;
Exercicis Pràctics
Exercici 1: Crear un Reducer
Crea un reducer que gestioni l'estat d'una llista de tasques. Les accions haurien de permetre afegir una tasca, eliminar una tasca i marcar una tasca com a completada.
Solució
const initialState = { tasks: [] }; function tasksReducer(state = initialState, action) { switch (action.type) { case 'ADD_TASK': return { ...state, tasks: [...state.tasks, action.payload] }; case 'REMOVE_TASK': return { ...state, tasks: state.tasks.filter(task => task.id !== action.payload.id) }; case 'TOGGLE_TASK': return { ...state, tasks: state.tasks.map(task => task.id === action.payload.id ? { ...task, completed: !task.completed } : task ) }; default: return state; } }
Exercici 2: Connectar el Reducer a un Component
Crea un component React que permeti afegir, eliminar i marcar tasques com a completades utilitzant el reducer creat a l'exercici anterior.
Solució
import React, { useState } from 'react'; import { useSelector, useDispatch } from 'react-redux'; const TaskList = () => { const tasks = useSelector((state) => state.tasks); const dispatch = useDispatch(); const [taskText, setTaskText] = useState(''); const addTask = () => { dispatch({ type: 'ADD_TASK', payload: { id: Date.now(), text: taskText, completed: false } }); setTaskText(''); }; const removeTask = (id) => { dispatch({ type: 'REMOVE_TASK', payload: { id } }); }; const toggleTask = (id) => { dispatch({ type: 'TOGGLE_TASK', payload: { id } }); }; return ( <div> <input type="text" value={taskText} onChange={(e) => setTaskText(e.target.value)} /> <button onClick={addTask}>Add Task</button> <ul> {tasks.map((task) => ( <li key={task.id}> <span style={{ textDecoration: task.completed ? 'line-through' : 'none' }} onClick={() => toggleTask(task.id)} > {task.text} </span> <button onClick={() => removeTask(task.id)}>Remove</button> </li> ))} </ul> </div> ); }; export default TaskList;
Resum
En aquesta secció, hem après els conceptes bàsics de Redux, com crear un store, definir accions i reducers, i connectar Redux amb React. També hem vist com utilitzar els hooks useSelector
i useDispatch
per interactuar amb l'estat de Redux des de components React. Els exercicis pràctics ens han ajudat a consolidar aquests conceptes. En el següent mòdul, explorarem altres aspectes avançats de Redux, com la gestió de middleware i la integració amb altres eines.
JavaScript: De Principiant a Avançat
Mòdul 1: Introducció a JavaScript
- Què és JavaScript?
- Configuració del Teu Entorn de Desenvolupament
- El Teu Primer Programa en JavaScript
- Sintaxi i Conceptes Bàsics de JavaScript
- Variables i Tipus de Dades
- Operadors Bàsics
Mòdul 2: Estructures de Control
- Declaracions Condicionals
- Bucles: for, while, do-while
- Declaracions Switch
- Gestió d'Errors amb try-catch
Mòdul 3: Funcions
- Definició i Crida de Funcions
- Expressions de Funció i Funcions Fletxa
- Paràmetres i Valors de Retorn
- Àmbit i Tancaments
- Funcions d'Ordre Superior
Mòdul 4: Objectes i Arrays
- Introducció als Objectes
- Mètodes d'Objecte i Paraula Clau 'this'
- Arrays: Conceptes Bàsics i Mètodes
- Iteració sobre Arrays
- Desestructuració d'Arrays
Mòdul 5: Objectes i Funcions Avançades
- Prototips i Herència
- Classes i Programació Orientada a Objectes
- Mòduls i Importació/Exportació
- JavaScript Asíncron: Callbacks
- Promeses i Async/Await
Mòdul 6: El Model d'Objectes del Document (DOM)
- Introducció al DOM
- Selecció i Manipulació d'Elements del DOM
- Gestió d'Esdeveniments
- Creació i Eliminació d'Elements del DOM
- Gestió i Validació de Formularis
Mòdul 7: APIs del Navegador i Temes Avançats
- Emmagatzematge Local i de Sessió
- Fetch API i AJAX
- WebSockets
- Service Workers i Aplicacions Web Progressives (PWAs)
- Introducció a WebAssembly
Mòdul 8: Proves i Depuració
- Depuració de JavaScript
- Proves Unitàries amb Jest
- Proves d'Integració
- Proves de Cap a Cap amb Cypress
Mòdul 9: Rendiment i Optimització
- Optimització del Rendiment de JavaScript
- Gestió de Memòria
- Manipulació Eficient del DOM
- Càrrega Per Mandat i Divisió de Codi
Mòdul 10: Frameworks i Llibreries de JavaScript
- Introducció a React
- Gestió d'Estat amb Redux
- Conceptes Bàsics de Vue.js
- Conceptes Bàsics d'Angular
- Triar el Framework Adequat