Maison > Article > interface Web > Réagir aux crochets avec exemple
Salut, collègue développeur d'interface utilisateur ! Êtes-vous prêt à plonger dans le monde passionnant de React Hooks ? Si vous travaillez avec React depuis un certain temps, vous vous souvenez peut-être de l'époque où les composants de classe étaient la solution privilégiée pour gérer l'état et les effets secondaires. Mais les temps ont changé et les React Hooks ont révolutionné la façon dont nous construisons des composants.
Dans ce guide convivial, nous explorerons 10 React Hooks essentiels, accompagnés d'exemples de didacticiels pour vous aider à les comprendre et à les mettre en œuvre dans vos projets. Que vous soyez nouveau sur Hooks ou que vous cherchiez à approfondir vos connaissances, cet article est là pour vous. Alors, prenez votre boisson préférée, installez-vous confortablement et embarquons ensemble dans cette aventure React Hooks !
Commençons par le Hook le plus couramment utilisé : useState. Ce petit bijou vous permet d'ajouter un état à vos composants fonctionnels sans avoir besoin de classes.
Le useState Hook renvoie un tableau avec deux éléments : la valeur de l'état actuel et une fonction pour la mettre à jour. Voici un exemple simple :
import React, { useState } from 'react'; function Counter() { const [count, setCount] = useState(0); return ( <div> <p>You clicked {count} times</p> <button onClick={() => setCount(count + 1)}> Click me </button> </div> ); }
Dans cet exemple, nous créons un compteur qui augmente à chaque fois que vous cliquez sur le bouton. Le useState Hook initialise notre compte à 0 et nous utilisons la fonction setCount pour le mettre à jour.
La prochaine étape est useEffect, le Hook qui vous permet d'effectuer des effets secondaires dans vos composants. C'est comme composantDidMount, composantDidUpdate et composantWillUnmount tous réunis en un !
useEffect prend deux arguments : une fonction à exécuter après le rendu et un tableau facultatif de dépendances. Voici un exemple :
import React, { useState, useEffect } from 'react'; function WindowWidth() { const [width, setWidth] = useState(window.innerWidth); useEffect(() => { const handleResize = () => setWidth(window.innerWidth); window.addEventListener('resize', handleResize); // Cleanup function return () => { window.removeEventListener('resize', handleResize); }; }, []); // Empty dependency array means this effect runs once on mount return <div>Window width: {width}px</div>; }
Dans cet exemple, nous utilisons useEffect pour ajouter un écouteur d'événement pour le redimensionnement de la fenêtre. La fonction de nettoyage supprime l'écouteur lorsque le composant est démonté.
Le hook useContext fournit un moyen de consommer du contexte dans des composants fonctionnels sans avoir besoin d'accessoires de rendu ou de composants d'ordre supérieur.
Tout d'abord, vous créez un contexte à l'aide de React.createContext(), puis utilisez le hook useContext pour le consommer :
import React, { useContext } from 'react'; const ThemeContext = React.createContext('light'); function ThemedButton() { const theme = useContext(ThemeContext); return <button className={theme}>I'm styled by theme context!</button>; } function App() { return ( <ThemeContext.Provider value="dark"> <ThemedButton /> </ThemeContext.Provider> ); }
Dans cet exemple, ThemedButton utilise le hook useContext pour accéder à la valeur actuelle du thème à partir de ThemeContext.
Quand useState ne suffit pas, useReducer vient à la rescousse. C'est particulièrement utile pour gérer une logique d'état plus complexe.
useReducer prend une fonction de réduction et un état initial, et renvoie l'état actuel associé à une méthode de répartition :
import React, { useReducer } from 'react'; const initialState = {count: 0}; function reducer(state, action) { switch (action.type) { case 'increment': return {count: state.count + 1}; case 'decrement': return {count: state.count - 1}; default: throw new Error(); } } function Counter() { const [state, dispatch] = useReducer(reducer, initialState); return ( <> Count: {state.count} <button onClick={() => dispatch({type: 'decrement'})}>-</button> <button onClick={() => dispatch({type: 'increment'})}>+</button> </> ); }
Dans cet exemple, nous utilisons useReducer pour gérer un compteur avec des actions d'incrémentation et de décrémentation.
Le hook useCallback peut vous aider à optimiser les performances de vos composants en mémorisant les fonctions de rappel.
useCallback renvoie une version mémorisée du rappel qui ne change que si l'une des dépendances a changé :
import React, { useState, useCallback } from 'react'; function ParentComponent() { const [count, setCount] = useState(0); const increment = useCallback(() => { setCount(c => c + 1); }, []); return ( <div> <ChildComponent onIncrement={increment} /> <p>Count: {count}</p> </div> ); } function ChildComponent({ onIncrement }) { console.log('ChildComponent rendered'); return <button onClick={onIncrement}>Increment</button>; }
Dans cet exemple, la fonction d'incrémentation est mémorisée avec useCallback, évitant ainsi les rendus inutiles de ChildComponent.
Similar to useCallback, useMemo is used for optimization, but it memoizes the result of a computation.
useMemo takes a function and an array of dependencies, and only recomputes the memoized value when one of the dependencies has changed:
import React, { useState, useMemo } from 'react'; function ExpensiveComponent({ list }) { const [filter, setFilter] = useState(''); const filteredList = useMemo(() => { console.log('Filtering list...'); return list.filter(item => item.toLowerCase().includes(filter.toLowerCase())); }, [list, filter]); return ( <div> <input type="text" value={filter} onChange={e => setFilter(e.target.value)} placeholder="Filter list" /> <ul> {filteredList.map(item => ( <li key={item}>{item}</li> ))} </ul> </div> ); }
In this example, we're using useMemo to memoize the filtered list, preventing unnecessary recalculations on every render.
The useRef Hook provides a way to create a mutable reference that persists across re-renders.
useRef returns a mutable ref object whose .current property is initialized to the passed argument:
import React, { useRef, useEffect } from 'react'; function AutoFocusInput() { const inputRef = useRef(null); useEffect(() => { inputRef.current.focus(); }, []); return <input ref={inputRef} />; }
In this example, we're using useRef to get a reference to the input element and focus it when the component mounts.
useImperativeHandle customizes the instance value that is exposed to parent components when using ref.
useImperativeHandle should be used with forwardRef:
import React, { useRef, useImperativeHandle, forwardRef } from 'react'; const FancyInput = forwardRef((props, ref) => { const inputRef = useRef(); useImperativeHandle(ref, () => ({ focus: () => { inputRef.current.focus(); }, getValue: () => { return inputRef.current.value; } })); return <input ref={inputRef} />; }); function Parent() { const fancyInputRef = useRef(); const handleClick = () => { fancyInputRef.current.focus(); console.log(fancyInputRef.current.getValue()); }; return ( <div> <FancyInput ref={fancyInputRef} /> <button onClick={handleClick}>Focus Input</button> </div> ); }
In this example, we're using useImperativeHandle to customize what instance value is exposed to the parent component.
useLayoutEffect is similar to useEffect, but it fires synchronously after all DOM mutations.
The signature is identical to useEffect, but it fires synchronously before the browser has a chance to paint:
import React, { useState, useLayoutEffect } from 'react'; function Tooltip() { const [tooltipHeight, setTooltipHeight] = useState(0); const tooltipRef = useRef(); useLayoutEffect(() => { const height = tooltipRef.current.clientHeight; setTooltipHeight(height); }, []); return ( <div> <div ref={tooltipRef}>Tooltip content</div> <p>The tooltip height is: {tooltipHeight}px</p> </div> ); }
In this example, we're using useLayoutEffect to measure the height of a DOM element synchronously before the browser paints.
Last but not least, useDebugValue can be used to display a label for custom hooks in React DevTools.
useDebugValue accepts a value and an optional formatting function:
import React, { useState, useDebugValue } from 'react'; function useFriendStatus(friendID) { const [isOnline, setIsOnline] = useState(null); // ... Logic to determine if the friend is online ... useDebugValue(isOnline ? 'Online' : 'Offline'); return isOnline; } function FriendListItem(props) { const isOnline = useFriendStatus(props.friend.id); return ( <li style={{ color: isOnline ? 'green' : 'black' }}> {props.friend.name} </li> ); }
In this example, we're using useDebugValue to display the friend's online status in React DevTools.
Wow, we've covered a lot of ground! From managing state with useState to optimizing performance with useMemo and useCallback, React Hooks offer a powerful and flexible way to build UI components. Let's recap the 10 Hooks we've explored:
Remember, the key to mastering React Hooks is practice. Start by incorporating them into your projects one at a time. As you become more comfortable, you'll find that Hooks can significantly simplify your code and make your components more reusable and easier to understand.
N'ayez pas peur d'expérimenter et de combiner différents Hooks pour résoudre des problèmes complexes. La communauté React propose constamment de nouveaux modèles et Hooks personnalisés, alors continuez à apprendre et à partager vos découvertes !
J'espère que ce guide convivial vous a aidé à mieux comprendre React Hooks. Bon codage, et que vos composants soient à jamais fonctionnels et accrocheurs !
"Les hooks sont un nouvel ajout dans React 16.8. Ils vous permettent d'utiliser l'état et d'autres fonctionnalités de React sans écrire de classe." - Documentation Réagir
Maintenant, allez-y et branchez-le ! ??
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!