We want to hear from you!Take our 2021 Community Survey!
This site is no longer updated.Go to react.dev

Référence de l'API des Hooks

These docs are old and won’t be updated. Go to react.dev for the new React docs.

These new documentation pages teach modern React:

Les Hooks sont une nouveautĂ© de React 16.8. Ils permettent de bĂ©nĂ©ficier d’un Ă©tat local et d’autres fonctionnalitĂ©s de React sans avoir Ă  Ă©crire de classes.

Cette page dĂ©crit l’API des Hooks prĂ©dĂ©finis de React.

Si les Hooks sont nouveaux pour vous, vous voudrez peut-ĂȘtre consulter l’aperçu en premier. Vous trouverez peut-ĂȘtre aussi des informations utiles dans la foire aux questions.

Les Hooks de base

useState

This content is out of date.

Read the new React documentation for useState.

const [state, setState] = useState(initialState);

Renvoie une valeur d’état local et une fonction pour la mettre Ă  jour.

Pendant le rendu initial, l’état local (state) a la mĂȘme valeur que celle passĂ©e en premier argument (initialState).

La fonction setState permet de mettre Ă  jour l’état local. Elle accepte une nouvelle valeur d’état local et planifie un nouveau rendu du composant.

setState(newState);

Au cours des rendus suivants, la premiĂšre valeur renvoyĂ©e par useState sera toujours celle de l’état local le plus rĂ©cent, une fois les mises Ă  jour effectuĂ©es.

Remarque

React garantit que l’identitĂ© de la fonction setState est stable et ne changera pas d’un rendu Ă  l’autre. C’est pourquoi on peut l’omettre de la liste des dĂ©pendances de useEffect et useCallback en toute sĂ©curitĂ©.

Mises Ă  jour fonctionnelles

Si le nouvel Ă©tat local est dĂ©duit de l’état local prĂ©cĂ©dent, vous pouvez passer une fonction Ă  setState. Cette fonction recevra la valeur prĂ©cĂ©dente de l’état local et renverra une nouvelle valeur de l’état local. Voici un exemple d’un composant compteur qui utilise les deux formes de setState :

function Counter({initialCount}) {
  const [count, setCount] = useState(initialCount);
  return (
    <>
      Total : {count}
      <button onClick={() => setCount(initialCount)}>Réinitialiser</button>
      <button onClick={() => setCount(prevCount => prevCount - 1)}>-</button>
      <button onClick={() => setCount(prevCount => prevCount + 1)}>+</button>
    </>
  );
}

Les boutons « + Â» et « - Â» utilisent la forme fonctionnelle, puisque la nouvelle valeur est calculĂ©e Ă  partir de la valeur prĂ©cĂ©dente. Le bouton « RĂ©initialiser Â» utilise quant Ă  lui la forme normale puisqu’il remet toujours le total Ă  sa valeur initiale.

Si votre fonction de mise Ă  jour renvoie exactement la mĂȘme valeur que l’état courant, le rendu ultĂ©rieur sera carrĂ©ment sautĂ©.

Remarque

À l’inverse de la mĂ©thode setState que l’on trouve dans les composants dĂ©finis Ă  l’aide d’une classe, useState ne fusionne pas automatiquement les objets de mise Ă  jour. Vous pouvez imiter ce comportement en combinant la forme fonctionnelle de mise Ă  jour avec la syntaxe de spread des objets :

const [state, setState] = useState({});
setState(prevState => {
  // Object.assign marcherait aussi
  return {...prevState, ...updatedValues};
});

Il est aussi possible d’utiliser useReducer, qui est plus adaptĂ© pour gĂ©rer les objets d’état local qui contiennent plusieurs sous-valeurs.

État local initial paresseux

Le rendu initial utilise l’argument initialState comme Ă©tat local. Au cours des rendus suivants, il est ignorĂ©. Si l’état local initial est le rĂ©sultat d’un calcul coĂ»teux, vous pouvez plutĂŽt fournir une fonction qui sera executĂ©e seulement au cours du rendu initial :

const [state, setState] = useState(() => {
  const initialState = someExpensiveComputation(props);
  return initialState;
});

Abandon de la mise Ă  jour de l’état local

Si vous mettez Ă  jour un Hook d’état avec la mĂȘme valeur que son Ă©tat actuel, React abandonnera cette mise Ă  jour, ce qui signifie qu’aucun nouveau rendu des enfants ne sera effectuĂ© et qu’aucun effet ne sera dĂ©clenchĂ©. (React utilise l’algorithme de comparaison Object.is.)

Remarquez que React peut quand mĂȘme avoir besoin d’afficher ce composant Ă  nouveau avant d’abandonner. Ça ne devrait pas pose problĂšme car React n’ira pas « plus profondĂ©ment Â» dans l’arbre. Si vous effectuez des calculs coĂ»teux lors du rendu, vous pouvez les optimiser avec useMemo.

Batching of state updates

React may group several state updates into a single re-render to improve performance. Normally, this improves performance and shouldn’t affect your application’s behavior.

Before React 18, only updates inside React event handlers were batched. Starting with React 18, batching is enabled for all updates by default. Note that React makes sure that updates from several different user-initiated events — for example, clicking a button twice — are always processed separately and do not get batched. This prevents logical mistakes.

In the rare case that you need to force the DOM update to be applied synchronously, you may wrap it in flushSync. However, this can hurt performance so do this only where needed.

useEffect

This content is out of date.

Read the new React documentation for useEffect.

useEffect(didUpdate);

Accepte une fonction qui contient du code impératif, pouvant éventuellement produire des effets.

L’utilisation de mutations, abonnements, horloges, messages de journalisation, et autres effets de bord n’est pas autorisĂ©e au sein du corps principal d’une fonction composant (qu’on appelle la phase de rendu de React). Autrement ça pourrait entraĂźner des bugs dĂ©concertants et des incohĂ©rences dans l’interface utilisateur (UI).

Pour ce faire, utilisez plutĂŽt useEffect. La fonction fournie Ă  useEffect sera exĂ©cutĂ©e aprĂšs que le rendu est apparu sur l’écran. Vous pouvez considĂ©rer les effets comme des Ă©chappatoires pour passer du monde purement fonctionnel de React au monde impĂ©ratif.

Par dĂ©faut, les effets de bord s’exĂ©cutent aprĂšs chaque rendu, mais vous pouvez choisir d’en exĂ©cuter certains uniquement quand certaines valeurs ont changĂ©.

Nettoyage d’un effet de bord

Souvent, les effets de bord crĂ©ent des ressources qui nĂ©cessitent d’ĂȘtre nettoyĂ©es avant que le composant ne quitte l’écran, telles qu’un abonnement ou l’ID d’une horloge. Pour ce faire, la fonction fournie Ă  useEffect peut renvoyer une fonction de nettoyage. Par exemple, pour crĂ©er un abonnement :

useEffect(() => {
  const subscription = props.source.subscribe();
  return () => {
    // Nettoyage de l'abonnement
    subscription.unsubscribe();
  };
});

La fonction de nettoyage est exĂ©cutĂ©e avant que le composant ne soit retirĂ© de l’UI pour Ă©viter les fuites de mĂ©moire. Par ailleurs, si un composant s’affiche plusieurs fois (comme c’est typiquement le cas), l’effet de bord prĂ©cĂ©dent est nettoyĂ© avant l’exĂ©cution du prochain effet de bord. Dans notre exemple, ça veut dire qu’un nouvel abonnement est créé Ă  chaque mise Ă  jour. Pour Ă©viter d’exĂ©cuter un effet de bord Ă  chaque mise Ă  jour, voyez la section sur l’exĂ©cution conditionnelle un peu plus loin.

Moment d’exĂ©cution des effets de bord

Contrairement Ă  componentDidMount et componentDidUpdate, la fonction fournie Ă  useEffect est exĂ©cutĂ©e de façon diffĂ©rĂ©e, aprĂšs la mise en page et l’affichage. useEffect est donc bien adaptĂ© pour une grande partie des effets de bord, comme la mise en place d’abonnements et de gestionnaires d’évĂ©nements, puisque la plupart des types de tĂąche ne devraient pas gĂȘner la mise Ă  jour de l’affichage par le navigateur.

Cependant, tous les effets de bord ne peuvent pas ĂȘtre diffĂ©rĂ©s. Par exemple, une mutation du DOM qui est visible pour l’utilisateur doit s’exĂ©cuter de maniĂšre synchrone avant l’affichage suivant, afin que l’utilisateur ne puisse pas percevoir une incohĂ©rence visuelle. (La distinction est conceptuellement similaire Ă  celle entre Ă©couteur d’évĂ©nement passif et actif.) Pour ces types d’effets de bord, React fournit un Hook supplĂ©mentaire appelĂ© useLayoutEffect. Il a la mĂȘme signature que useEffect, et s’en distingue seulement par le moment oĂč il s’exĂ©cute.

Bien que useEffect soit diffĂ©rĂ© jusqu’à ce que le navigateur ait terminĂ© l’affichage, son exĂ©cution est garantie avant les rendus ultĂ©rieurs. React traitera toujours les effets de bord des rendus prĂ©cĂ©dents avant de commencer une nouvelle mise Ă  jour.

Additionally, starting in React 18, the function passed to useEffect will fire synchronously before layout and paint when it’s the result of a discrete user input such as a click, or when it’s the result of an update wrapped in flushSync. This behavior allows the result of the effect to be observed by the event system, or by the caller of flushSync.

Note

This only affects the timing of when the function passed to useEffect is called - updates scheduled inside these effects are still deferred. This is different than useLayoutEffect, which fires the function and processes the updates inside of it immediately.

Even in cases where useEffect is deferred until after the browser has painted, it’s guaranteed to fire before any new renders. React will always flush a previous render’s effects before starting a new update.

Le comportement par dĂ©faut des effets de bord consiste Ă  exĂ©cuter l’effet aprĂšs chaque affichage. Ainsi, un effet est toujours recréé si une de ses entrĂ©es (les donnĂ©es dont il dĂ©pend) change.

Cependant, ça pourrait ĂȘtre exagĂ©rĂ© dans certains cas, comme dans l’exemple avec l’abonnement dans la section prĂ©cĂ©dente. On n’a pas besoin d’un nouvel abonnement Ă  chaque mise Ă  jour, mais seulement si la prop source a changĂ©.

Pour mettre ça en Ɠuvre, fournissez un deuxiĂšme argument Ă  useEffect qui consiste en un tableau de valeurs dont l’effet dĂ©pend. Notre exemple mis Ă  jour ressemble maintenant Ă  ça :

useEffect(
  () => {
    const subscription = props.source.subscribe();
    return () => {
      subscription.unsubscribe();
    };
  },
  [props.source],
);

L’abonnement sera maintenant recréé uniquement quand props.source change.

Remarque

Si vous utilisez cette optimisation, assurez-vous que votre tableau inclut bien toutes les valeurs dans la portĂ©e du composant (telles que les props et l’état local) qui peuvent changer avec le temps et sont utilisĂ©es par l’effet. Sinon, votre code va rĂ©fĂ©rencer des valeurs obsolĂštes issues des rendus prĂ©cĂ©dents. Vous pouvez en apprendre davantage sur la façon de gĂ©rer les dĂ©pendances Ă  des fonctions et comment faire quand les dĂ©pendances listĂ©es changent trop souvent.

Si vous voulez exĂ©cuter un effet et le nettoyer une seule fois (au montage puis au dĂ©montage), vous pouvez passer un tableau vide ([]) comme deuxiĂšme argument. Ça indique Ă  React que votre effet ne dĂ©pend d’aucune valeur issue des props ou de l’état local, donc il n’a jamais besoin d’ĂȘtre rĂ©-exĂ©cutĂ©. Il ne s’agit pas d’un cas particulier : ça dĂ©coule directement de la façon dont le tableau des dĂ©pendances fonctionne.

Si vous passez un tableau vide ([]), les props et l’état local vus depuis l’intĂ©rieur de l’effet feront toujours rĂ©fĂ©rence Ă  leurs valeurs initiales. MĂȘme si passer [] comme deuxiĂšme argument vous rapproche du modĂšle mental habituel de componentDidMount et componentWillUnmount, il y a en gĂ©nĂ©ral de meilleures solutions pour Ă©viter de rĂ©-exĂ©cuter les effets trop souvent. Par ailleurs, ne perdez pas de vue que React dĂ©fĂšre l’exĂ©cution de useEffect jusqu’à ce que la navigateur ait fini de rafraĂźchir l’affichage, du coup y faire plus de travail est moins un problĂšme.

Nous vous conseillons d’utiliser la rĂšgle exhaustive-deps fournie par le module eslint-plugin-react-hooks. Elle vous avertira si des dĂ©pendances sont mal spĂ©cifiĂ©es et vous suggĂšrera un correctif.

Le tableau d’entrĂ©es n’est pas fourni comme argument Ă  la fonction d’effet. Conceptuellement cependant, c’est en quelque sorte ce qui se passe : chaque valeur rĂ©fĂ©rencĂ©e dans la fonction d’effet devrait aussi apparaĂźtre dans le tableau d’entrĂ©es. À l’avenir, un compilateur suffisamment avancĂ© pourrait crĂ©er ce tableau automatiquement.

useContext

This content is out of date.

Read the new React documentation for useContext.

const value = useContext(MyContext);

Accepte un objet contexte (la valeur renvoyĂ©e par React.createContext), et renvoie la valeur actuelle du contexte. Celle-ci est dĂ©terminĂ©e par la prop value du plus proche <MyContext.Provider> au-dessus du composant dans l’arbre.

Quand le plus proche <MyContext.Provider> au-dessus du composant est mis Ă  jour, ce Hook va dĂ©clencher un rafraĂźchissement avec la value la plus rĂ©cente passĂ©e au fournisseur MyContext. MĂȘme si un ancĂȘtre utilise React.memo ou shouldComponentUpdate, le rendu aura quand mĂȘme Ă  nouveau lieu Ă  partir du composant qui recourt Ă  useContext.

N’oubliez pas que l’argument de useContext doit ĂȘtre l’objet contexte lui-mĂȘme :

  • Correct : useContext(MyContext)
  • ErronĂ© : useContext(MyContext.Consumer)
  • ErronĂ© : useContext(MyContext.Provider)

Un composant qui appelle useContext se rafraĂźchira toujours quand la valeur du contexte change. Si ce rafraĂźchissement est coĂ»teux, vous pouvez l’optimiser grĂące Ă  la mĂ©moĂŻsation.

Astuce

Si vous aviez l’habitude de l’API de Contexte avant les Hooks, useContext(MyContext) est Ă©quivalent Ă  static contextType = MyContext dans une classe, ou Ă  <MyContext.Consumer>.

useContext(MyContext) vous permet seulement de lire le contexte et de vous abonner à ses modifications. Vous aurez toujours besoin d’un <MyContext.Provider> plus haut dans l’arbre pour fournir une valeur de contexte.

Un exemple consolidé avec Context.Provider

const themes = {
  light: {
    foreground: "#000000",
    background: "#eeeeee"
  },
  dark: {
    foreground: "#ffffff",
    background: "#222222"
  }
};

const ThemeContext = React.createContext(themes.light);

function App() {
  return (
    <ThemeContext.Provider value={themes.dark}>
      <Toolbar />
    </ThemeContext.Provider>
  );
}

function Toolbar(props) {
  return (
    <div>
      <ThemedButton />
    </div>
  );
}

function ThemedButton() {
  const theme = useContext(ThemeContext);  return (    <button style={{ background: theme.background, color: theme.foreground }}>      Je suis stylé par le contexte de thÚme !    </button>  );
}

Cet exemple est une version modifiĂ©e pour utiliser les Hooks de l’exemple dans le guide avancĂ© des Contextes, au sein duquel vous pourrez trouver davantage d’informations sur l’utilisation appropriĂ©e de Context.

Hooks supplémentaires

Les Hooks qui suivent sont soit des variantes des Hooks basiques des sections précédentes, soit seulement nécessaires pour des cas à la marge spécifiques. Ne vous sentez pas obligé·e de les apprendre dÚs le départ.

useReducer

This content is out of date.

Read the new React documentation for useReducer.

const [state, dispatch] = useReducer(reducer, initialArg, init);

Alternative Ă  useState. Accepte un rĂ©ducteur de type (state, action) => newState, et renvoie l’état local actuel accompagnĂ© d’une mĂ©thode dispatch. (Si vous avez l’habitude de Redux, vous savez dĂ©jĂ  comment ça fonctionne.)

useReducer est souvent prĂ©fĂ©rable Ă  useState quand vous avez une logique d’état local complexe qui comprend plusieurs sous-valeurs, ou quand l’état suivant dĂ©pend de l’état prĂ©cĂ©dent. useReducer vous permet aussi d’optimiser les performances pour des composants qui dĂ©clenchent des mises Ă  jours profondes puisque vous pouvez fournir dispatch Ă  la place de fonctions de rappel.

Voici l’exemple du composant compteur du paragraphe useState rĂ©-Ă©crit avec un rĂ©ducteur :

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 (
    <>
      Total : {state.count}
      <button onClick={() => dispatch({type: 'decrement'})}>-</button>
      <button onClick={() => dispatch({type: 'increment'})}>+</button>
    </>
  );
}

Remarque

React garantit que l’identitĂ© de la fonction dispatch est stable et ne changera pas d’un rendu Ă  l’autre. C’est pourquoi on peut l’omettre de la liste des dĂ©pendances de useEffect et useCallback en toute sĂ©curitĂ©.

PrĂ©ciser l’état local initial

Il existe deux maniĂšres diffĂ©rentes d’initialiser l’état de useReducer. Vous pouvez choisir l’une ou l’autre suivant le cas. La maniĂšre la plus simple consiste Ă  fournir l’état initial comme deuxiĂšme argument :

  const [state, dispatch] = useReducer(
    reducer,
    {count: initialCount}  );

Remarque

React n’utilise pas la convention d’argument state = initialState popularisĂ©e par Redux. La valeur initiale doit parfois dĂ©pendre de props et c’est donc plutĂŽt l’appel du Hook qui la prĂ©cise. Si vous avez dĂ©jĂ  une prĂ©fĂ©rence bien arrĂȘtĂ©e lĂ -dessus, vous pouvez utiliser useReducer(reducer, undefined, reducer) pour simuler le comportement de Redux, mais nous ne vous le conseillons pas.

Initialisation paresseuse

Vous pouvez aussi crĂ©er l’état local initial paresseusement. Pour ce faire, vous pouvez fournir une fonction init comme troisiĂšme argument. L’état initial sera alors Ă©gal Ă  init(initialArg).

Ça vous permet d’extraire la logique pour calculer l’état local initial hors du rĂ©ducteur. C’est aussi pratique pour rĂ©initialiser l’état local en rĂ©ponse Ă  une action ultĂ©rieure :

function init(initialCount) {  return {count: initialCount};}
function reducer(state, action) {
  switch (action.type) {
    case 'increment':
      return {count: state.count + 1};
    case 'decrement':
      return {count: state.count - 1};
    case 'reset':      return init(action.payload);    default:
      throw new Error();
  }
}

function Counter({initialCount}) {
  const [state, dispatch] = useReducer(reducer, initialCount, init);  return (
    <>
      Total : {state.count}
      <button
        onClick={() => dispatch({type: 'reset', payload: initialCount})}>        Réinitialiser
      </button>
      <button onClick={() => dispatch({type: 'decrement'})}>-</button>
      <button onClick={() => dispatch({type: 'increment'})}>+</button>
    </>
  );
}

Abandon d’un dispatch

Si vous renvoyez la mĂȘme valeur que l’état actuel dans un Hook de rĂ©duction, React abandonnera la mise Ă  jour, ce qui signifie qu’aucun nouveau rendu des enfants ne sera effectuĂ© et qu’aucun effet ne sera dĂ©clenchĂ©. (React utilise l’algorithme de comparaison Object.is.)

Remarquez que React pourrait encore avoir besoin de mettre Ă  jour ce composant spĂ©cifique avant de lĂącher l’affaire. Ça ne devrait pas vous soucier car React n’ira pas inutilement « plus profond Â» dans l’arbre. Si vous effectuez des calculs coĂ»teux lors du rendu, vous pouvez les optimiser avec useMemo.

useCallback

This content is out of date.

Read the new React documentation for useCallback.

const memoizedCallback = useCallback(
  () => {
    doSomething(a, b);
  },
  [a, b],
);

Renvoie une fonction de rappel mémoïsée

Fournissez une fonction de rappel et un tableau d’entrĂ©es. useCallback renverra une version mĂ©moĂŻsĂ©e de la fonction de rappel qui changera uniquement si une des entrĂ©es a changĂ©. C’est utile pour passer des fonctions de rappel Ă  des composants enfants optimisĂ©s qui se basent sur une Ă©galitĂ© rĂ©fĂ©rentielle pour Ă©viter des rendus superflus (par exemple avec shouldComponentUpdate).

useCallback(fn, inputs) est équivalent à useMemo(() => fn, inputs).

Remarque

Le tableau d’entrĂ©es n’est pas fourni comme argument Ă  la fonction de rappel. Conceptuellement cependant, c’est en quelque sorte ce qui se passe : chaque valeur rĂ©fĂ©rencĂ©e dans la fonction de rappel devrait aussi apparaĂźtre dans le tableau d’entrĂ©es. À l’avenir, un compilateur suffisamment avancĂ© pourrait crĂ©er ce tableau automatiquement.

Nous vous conseillons d’utiliser la rĂšgle exhaustive-deps fournie par le module eslint-plugin-react-hooks. Elle vous avertira si des dĂ©pendances sont mal spĂ©cifiĂ©es et vous suggĂšrera un correctif.

useMemo

This content is out of date.

Read the new React documentation for useMemo.

const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);

Renvoie une valeur mémoïsée

Fournissez une fonction de « crĂ©ation Â» et un tableau d’entrĂ©es. useMemo recalculera la valeur mĂ©moĂŻsĂ©e seulement si une des entrĂ©es a changĂ©. Cette optimisation permet d’éviter des calculs coĂ»teux Ă  chaque rendu.

Rappelez-vous que la fonction fournie Ă  useMemo s’exĂ©cute pendant le rendu. N’y faites rien que vous ne feriez pas normalement pendant un rendu. Par exemple, les effets de bord doivent passer par useEffect, et non useMemo.

Si vous ne fournissez aucun tableau, une nouvelle valeur sera calculée à chaque appel.

Vous pouvez vous appuyer sur useMemo comme un moyen d’optimiser les performances, mais pas comme une garantie sĂ©mantique. À l’avenir, React pourrait choisir « d’oublier Â» certaines valeurs prĂ©cĂ©demment mĂ©moĂŻsĂ©es et de les recalculer au rendu suivant, par exemple pour libĂ©rer la mĂ©moire exploitĂ©e par des composants prĂ©sents hors de l’écran. Écrivez votre code de façon Ă  ce qu’il fonctionne sans useMemo et ajoutez-le ensuite pour optimiser les performances.

Remarque

Le tableau d’entrĂ©es n’est pas fourni comme argument Ă  la fonction. Conceptuellement cependant, c’est en quelque sorte ce qui se passe : chaque valeur rĂ©fĂ©rencĂ©e dans la fonction devrait aussi apparaĂźtre dans le tableau d’entrĂ©es. À l’avenir, un compilateur suffisamment avancĂ© pourrait crĂ©er ce tableau automatiquement.

Nous vous conseillons d’utiliser la rĂšgle exhaustive-deps fournie par le module eslint-plugin-react-hooks. Elle vous avertira si des dĂ©pendances sont mal spĂ©cifiĂ©es et vous suggĂšrera un correctif.

useRef

This content is out of date.

Read the new React documentation for useRef.

const refContainer = useRef(initialValue);

useRef renvoie un objet ref modifiable dont la propriĂ©tĂ© current est initialisĂ©e avec l’argument fourni (initialValue). L’objet renvoyĂ© persistera pendant toute la durĂ©e de vie du composant.

Un cas d’usage courant consiste Ă  accĂ©der Ă  un enfant de maniĂšre impĂ©rative :

function TextInputWithFocusButton() {
  const inputEl = useRef(null);
  const onButtonClick = () => {
    // `current` fait référence au champ textuel monté dans le DOM
    inputEl.current.focus();
  };
  return (
    <>
      <input ref={inputEl} type="text" />
      <button onClick={onButtonClick}>Donner le focus au champ</button>
    </>
  );
}

En gros, useRef est comme une « boßte » qui pourrait contenir une valeur modifiable dans sa propriété .current.

Vous avez peut-ĂȘtre l’habitude d’utiliser des refs principalement pour accĂ©der au DOM. Si vous passez un objet ref Ă  React avec <div ref={myRef} />, React calera sa propriĂ©tĂ© .current sur le nƓud DOM correspondant chaque fois que ce dernier change.

Ceci dit, useRef() est utile au-delà du seul attribut ref. C’est pratique pour garder des valeurs modifiables sous la main, comme lorsque vous utilisez des champs d’instance dans les classes.

Ça fonctionne parce que useRef() crĂ©e un objet JavaScript brut. La seule diffĂ©rence entre useRef() et la crĂ©ation manuelle d’un objet {current: ... }, c’est que useRef vous donnera le mĂȘme objet Ă  chaque rendu.

Gardez Ă  l’esprit que useRef ne vous notifie pas quand le contenu change. Modifier la propriĂ©tĂ© .current n’entraĂźne pas un rafraĂźchissement. Si vous voulez exĂ©cuter du code quand React attache ou dĂ©tache une ref sur un nƓud DOM, vous voudrez sans doute utiliser plutĂŽt une ref Ă  base de fonction de rappel.

useImperativeHandle

This content is out of date.

Read the new React documentation for useImperativeHandle.

useImperativeHandle(ref, createHandle, [deps])

useImperativeHandle personnalise l’instance qui est exposĂ©e au composant parent lors de l’utilisation de ref. Comme toujours, il vaut mieux s’abstenir d’utiliser du code impĂ©ratif manipulant des refs dans la plupart des cas. useImperativeHandle est conçu pour ĂȘtre utilisĂ© en conjonction avec forwardRef :

function FancyInput(props, ref) {
  const inputRef = useRef();
  useImperativeHandle(ref, () => ({
    focus: () => {
      inputRef.current.focus();
    }
  }));
  return <input ref={inputRef} ... />;
}
FancyInput = forwardRef(FancyInput);

Dans cet exemple, un composant parent qui utiliserait <FancyInput ref={inputRef} /> pourrait appeler inputRef.current.focus().

useLayoutEffect

This content is out of date.

Read the new React documentation for useLayoutEffect.

La signature est identique Ă  celle de useEffect, mais useLayoutEffect s’exĂ©cute de maniĂšre synchrone aprĂšs que toutes les mutations du DOM ont eu lieu. Utilisez-le pour inspecter la mise en page du DOM et effectuer un nouveau rendu de maniĂšre synchrone. Les mises Ă  jour planifiĂ©es dans useLayoutEffect seront traitĂ©es de maniĂšre synchrone avant que le navigateur ait pu procĂ©der Ă  l’affichage.

PrĂ©fĂ©rez l’utilisation du useEffect standard chaque fois que possible, pour Ă©viter de bloquer les mises Ă  jour visuelles.

Astuce

Si vous migrez du code depuis un composant Ă©crit Ă  l’aide d’une classe, sachez que useLayoutEffect s’exĂ©cute dans la mĂȘme phase que componentDidMount et componentDidUpdate. Nous vous conseillons de commencer avec useEffect, et de ne tenter useLayoutEffect que si vous rencontrez des problĂšmes.

Si vous faites du rendu cĂŽtĂ© serveur , n’oubliez pas que ni useLayoutEffect ni useEffect ne seront exĂ©cutĂ©s jusqu’à ce que votre code JS soit tĂ©lĂ©chargĂ© et exĂ©cutĂ© cĂŽtĂ© client. C’est pourquoi React vous averti quand un composant utilise useLayoutEffect dans le cadre d’un rendu cĂŽtĂ© serveur. Pour corriger ça, vous pouvez soit dĂ©placer la logique dans useEffect (si elle n’est pas nĂ©cessaire pour le premier affichage), soit reporter l’affichage du composant jusqu’à ce que l’affichage cĂŽtĂ© client soit effectuĂ© (si le HTML aurait eu l’air cassĂ© avant exĂ©cution du useLayoutEffect).

Pour exclure un composant nĂ©cessitant des effets de mise en page (layout effects, NdT) du HTML gĂ©nĂ©rĂ© cĂŽtĂ© serveur, vous pouvez l’afficher conditionnellement avec un showChild && <Child />, et diffĂ©rer son affichage grĂące Ă  un useEffect(() => { setShowChild(true); }, []). Ainsi, l’UI ne semblera pas cassĂ© avec son hydratation.

useDebugValue

This content is out of date.

Read the new React documentation for useDebugValue.

useDebugValue(value)

Vous pouvez utiliser useDebugValue pour afficher une étiquette pour les Hooks personnalisés dans les outils de développement React (React DevTools, NdT).

Par exemple, prenez le hook personnalisĂ© useFriendStatus dĂ©crit dans « Construire vos propres Hooks Â» :

function useFriendStatus(friendID) {
  const [isOnline, setIsOnline] = useState(null);

  // ...

  // Affiche une étiquette dans les DevTools à cÎté de ce Hook  // par exemple, "FriendStatus: En ligne"  useDebugValue(isOnline ? 'En ligne' : 'Hors-ligne');
  return isOnline;
}

Astuce

Nous dĂ©conseillons d’ajouter ces Ă©tiquettes Ă  chaque Hook personnalisĂ©. C’est surtout utile pour les Hooks personnalisĂ©s provenant de bibliothĂšques partagĂ©es.

Différer le formatage des valeurs de débogage

Formater une valeur Ă  afficher peut parfois s’avĂ©rer coĂ»teux. C’est par ailleurs inutile tant que le Hook n’est pas effectivement inspectĂ©.

C’est pourquoi useDebugValue accepte une fonction de formatage comme deuxiĂšme argument optionnel. Cette fonction est appelĂ©e uniquement si les Hooks sont inspectĂ©s. Elle reçoit la valeur de dĂ©bogage comme argument et devrait renvoyer la valeur formatĂ©e.

Par exemple, un Hook personnalisĂ© qui renvoie une valeur Date pourrait Ă©viter d’appeler inutilement la fonction toDateString en fournissant le formateur suivant :

useDebugValue(date, date => date.toDateString());

useDeferredValue

This content is out of date.

Read the new React documentation for useDeferredValue.

const deferredValue = useDeferredValue(value);

useDeferredValue accepts a value and returns a new copy of the value that will defer to more urgent updates. If the current render is the result of an urgent update, like user input, React will return the previous value and then render the new value after the urgent render has completed.

This hook is similar to user-space hooks which use debouncing or throttling to defer updates. The benefits to using useDeferredValue is that React will work on the update as soon as other work finishes (instead of waiting for an arbitrary amount of time), and like startTransition, deferred values can suspend without triggering an unexpected fallback for existing content.

Memoizing deferred children

useDeferredValue only defers the value that you pass to it. If you want to prevent a child component from re-rendering during an urgent update, you must also memoize that component with React.memo or React.useMemo:

function Typeahead() {
  const query = useSearchQuery('');
  const deferredQuery = useDeferredValue(query);

  // Memoizing tells React to only re-render when deferredQuery changes,
  // not when query changes.
  const suggestions = useMemo(() =>
    <SearchSuggestions query={deferredQuery} />,
    [deferredQuery]
  );

  return (
    <>
      <SearchInput query={query} />
      <Suspense fallback="Loading results...">
        {suggestions}
      </Suspense>
    </>
  );
}

Memoizing the children tells React that it only needs to re-render them when deferredQuery changes and not when query changes. This caveat is not unique to useDeferredValue, and it’s the same pattern you would use with similar hooks that use debouncing or throttling.

useTransition

This content is out of date.

Read the new React documentation for useTransition.

const [isPending, startTransition] = useTransition();

Returns a stateful value for the pending state of the transition, and a function to start it.

startTransition lets you mark updates in the provided callback as transitions:

startTransition(() => {
  setCount(count + 1);
});

isPending indicates when a transition is active to show a pending state:

function App() {
  const [isPending, startTransition] = useTransition();
  const [count, setCount] = useState(0);
  
  function handleClick() {
    startTransition(() => {
      setCount(c => c + 1);
    });
  }

  return (
    <div>
      {isPending && <Spinner />}
      <button onClick={handleClick}>{count}</button>
    </div>
  );
}

Note:

Updates in a transition yield to more urgent updates such as clicks.

Updates in a transition will not show a fallback for re-suspended content. This allows the user to continue interacting with the current content while rendering the update.

useId

This content is out of date.

Read the new React documentation for useId.

const id = useId();

useId is a hook for generating unique IDs that are stable across the server and client, while avoiding hydration mismatches.

Note

useId is not for generating keys in a list. Keys should be generated from your data.

For a basic example, pass the id directly to the elements that need it:

function Checkbox() {
  const id = useId();
  return (
    <>
      <label htmlFor={id}>Do you like React?</label>
      <input id={id} type="checkbox" name="react"/>
    </>
  );
};

For multiple IDs in the same component, append a suffix using the same id:

function NameFields() {
  const id = useId();
  return (
    <div>
      <label htmlFor={id + '-firstName'}>First Name</label>
      <div>
        <input id={id + '-firstName'} type="text" />
      </div>
      <label htmlFor={id + '-lastName'}>Last Name</label>
      <div>
        <input id={id + '-lastName'} type="text" />
      </div>
    </div>
  );
}

Note:

useId generates a string that includes the : token. This helps ensure that the token is unique, but is not supported in CSS selectors or APIs like querySelectorAll.

useId supports an identifierPrefix to prevent collisions in multi-root apps. To configure, see the options for hydrateRoot and ReactDOMServer.

Library Hooks

The following Hooks are provided for library authors to integrate libraries deeply into the React model, and are not typically used in application code.

useSyncExternalStore

This content is out of date.

Read the new React documentation for useSyncExternalStore.

const state = useSyncExternalStore(subscribe, getSnapshot[, getServerSnapshot]);

useSyncExternalStore is a hook recommended for reading and subscribing from external data sources in a way that’s compatible with concurrent rendering features like selective hydration and time slicing.

This method returns the value of the store and accepts three arguments:

  • subscribe: function to register a callback that is called whenever the store changes.
  • getSnapshot: function that returns the current value of the store.
  • getServerSnapshot: function that returns the snapshot used during server rendering.

The most basic example simply subscribes to the entire store:

const state = useSyncExternalStore(store.subscribe, store.getSnapshot);

However, you can also subscribe to a specific field:

const selectedField = useSyncExternalStore(
  store.subscribe,
  () => store.getSnapshot().selectedField,
);

When server rendering, you must serialize the store value used on the server, and provide it to useSyncExternalStore. React will use this snapshot during hydration to prevent server mismatches:

const selectedField = useSyncExternalStore(
  store.subscribe,
  () => store.getSnapshot().selectedField,
  () => INITIAL_SERVER_SNAPSHOT.selectedField,
);

Note:

getSnapshot must return a cached value. If getSnapshot is called multiple times in a row, it must return the same exact value unless there was a store update in between.

A shim is provided for supporting multiple React versions published as use-sync-external-store/shim. This shim will prefer useSyncExternalStore when available, and fallback to a user-space implementation when it’s not.

As a convenience, we also provide a version of the API with automatic support for memoizing the result of getSnapshot published as use-sync-external-store/with-selector.

useInsertionEffect

This content is out of date.

Read the new React documentation for useInsertionEffect.

useInsertionEffect(didUpdate);

The signature is identical to useEffect, but it fires synchronously before all DOM mutations. Use this to inject styles into the DOM before reading layout in useLayoutEffect. Since this hook is limited in scope, this hook does not have access to refs and cannot schedule updates.

Note:

useInsertionEffect should be limited to css-in-js library authors. Prefer useEffect or useLayoutEffect instead.

Avez-vous trouvĂ© cette page utile ?Modifier cette page