Introducció
La API de context de React és una eina poderosa que permet compartir dades entre components sense haver de passar explícitament les props a través de cada nivell de l'arbre de components. Això és especialment útil per a dades globals com l'usuari autenticat, el tema de l'aplicació, o la configuració de la llengua.
Conceptes clau
- Context: Un objecte que permet compartir dades entre components sense haver de passar props manualment a cada nivell.
- Provider: Un component que proporciona el context als seus fills.
- Consumer: Un component que consumeix el context proporcionat pel Provider.
Creació d'un Context
Per crear un context, utilitzem la funció createContext de React. Aquí teniu un exemple bàsic:
import React, { createContext } from 'react';
// Creem el context
const MyContext = createContext();
// Exportem el context per utilitzar-lo en altres components
export default MyContext;Utilització del Provider
El Provider és un component que permet als components fills accedir al context. Aquí teniu un exemple de com utilitzar el Provider:
import React, { useState } from 'react';
import MyContext from './MyContext';
const MyProvider = ({ children }) => {
const [value, setValue] = useState('Hola, món!');
return (
<MyContext.Provider value={{ value, setValue }}>
{children}
</MyContext.Provider>
);
};
export default MyProvider;Consumir el Context
Per consumir el context, podem utilitzar el hook useContext o el component Consumer. Aquí teniu exemples de les dues maneres:
Utilitzant el hook useContext
import React, { useContext } from 'react';
import MyContext from './MyContext';
const MyComponent = () => {
const { value, setValue } = useContext(MyContext);
return (
<div>
<p>{value}</p>
<button onClick={() => setValue('Hola, React!')}>Canviar valor</button>
</div>
);
};
export default MyComponent;Utilitzant el component Consumer
import React from 'react';
import MyContext from './MyContext';
const MyComponent = () => {
return (
<MyContext.Consumer>
{({ value, setValue }) => (
<div>
<p>{value}</p>
<button onClick={() => setValue('Hola, React!')}>Canviar valor</button>
</div>
)}
</MyContext.Consumer>
);
};
export default MyComponent;Exemple complet
Aquí teniu un exemple complet que mostra com crear un context, utilitzar un provider i consumir el context en un component:
// MyContext.js
import React, { createContext } from 'react';
const MyContext = createContext();
export default MyContext;
// MyProvider.js
import React, { useState } from 'react';
import MyContext from './MyContext';
const MyProvider = ({ children }) => {
const [value, setValue] = useState('Hola, món!');
return (
<MyContext.Provider value={{ value, setValue }}>
{children}
</MyContext.Provider>
);
};
export default MyProvider;
// MyComponent.js
import React, { useContext } from 'react';
import MyContext from './MyContext';
const MyComponent = () => {
const { value, setValue } = useContext(MyContext);
return (
<div>
<p>{value}</p>
<button onClick={() => setValue('Hola, React!')}>Canviar valor</button>
</div>
);
};
export default MyComponent;
// App.js
import React from 'react';
import MyProvider from './MyProvider';
import MyComponent from './MyComponent';
const App = () => {
return (
<MyProvider>
<MyComponent />
</MyProvider>
);
};
export default App;Exercicis pràctics
Exercici 1: Crear un context per a un tema
- Crea un context per gestionar el tema de l'aplicació (clar o fosc).
- Crea un provider que permeti canviar el tema.
- Crea un component que mostri el tema actual i un botó per canviar-lo.
Solució
// ThemeContext.js
import React, { createContext, useState } from 'react';
const ThemeContext = createContext();
export const ThemeProvider = ({ children }) => {
const [theme, setTheme] = useState('light');
const toggleTheme = () => {
setTheme((prevTheme) => (prevTheme === 'light' ? 'dark' : 'light'));
};
return (
<ThemeContext.Provider value={{ theme, toggleTheme }}>
{children}
</ThemeContext.Provider>
);
};
export default ThemeContext;
// ThemeComponent.js
import React, { useContext } from 'react';
import ThemeContext from './ThemeContext';
const ThemeComponent = () => {
const { theme, toggleTheme } = useContext(ThemeContext);
return (
<div>
<p>Tema actual: {theme}</p>
<button onClick={toggleTheme}>Canviar tema</button>
</div>
);
};
export default ThemeComponent;
// App.js
import React from 'react';
import { ThemeProvider } from './ThemeContext';
import ThemeComponent from './ThemeComponent';
const App = () => {
return (
<ThemeProvider>
<ThemeComponent />
</ThemeProvider>
);
};
export default App;Resum
En aquesta secció, hem après què és la API de context de React i com utilitzar-la per compartir dades entre components sense haver de passar props manualment. Hem vist com crear un context, utilitzar un provider i consumir el context en components. També hem practicat aquests conceptes amb un exercici pràctic. En el proper mòdul, explorarem la introducció i ús bàsic dels hooks en React.
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
