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
