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