Section courante

A propos

Section administrative du site

useLayoutEffect

Utilise une couche d'effet
React

Piège : useLayoutEffect peut nuire aux performances. Privilégiez useEffect lorsque cela est possible.

useLayoutEffect(setup, dependencies?)

useLayoutEffect est une version de useEffect qui se déclenche avant que le navigateur ne redessine l'écran.

Référence

useLayoutEffect(setup, dependencies?)

Appelez useLayoutEffect pour effectuer les mesures de mise en page avant que le navigateur ne repeigne l'écran :

  1. import { useState, useRef, useLayoutEffect } from 'react';
  2.  
  3. function Tooltip() {
  4.   const ref = useRef(null);
  5.   const [tooltipHeight, setTooltipHeight] = useState(0);
  6.  
  7.   useLayoutEffect(() => {
  8.     const { height } = ref.current.getBoundingClientRect();
  9.     setTooltipHeight(height);
  10.   }, []);
  11.   // ...

Paramètres

Nom Description
setup La fonction contenant la logique de votre effet. Votre fonction de configuration peut également renvoyer une fonction de nettoyage (optionnelle). Avant l'ajout de votre composant au DOM, React exécutera votre fonction de configuration. Après chaque nouveau rendu avec des dépendances modifiées, React exécutera d'abord la fonction de nettoyage (si vous l'avez fournie) avec les anciennes valeurs, puis exécutera votre fonction de configuration avec les nouvelles valeurs. Avant la suppression de votre composant du DOM, React exécutera votre fonction de nettoyage.
dependencies optionnelles : La liste de toutes les valeurs réactives référencées dans le code de configuration. Les valeurs réactives incluent les propriétés, l'état et toutes les variables et fonctions déclarées directement dans le corps de votre composant. Si votre linter est configuré pour React, il vérifiera que chaque valeur réactive est correctement spécifiée comme dépendance. La liste des dépendances doit comporter un nombre constant d'éléments et être écrite en ligne, comme [dep1, dep2, dep3]. React comparera chaque dépendance à sa valeur précédente grâce à la comparaison Object.is. Si vous omettez cet argument, votre effet sera réexécuté après chaque rendu de la composante.

Renvoie

useLayoutEffect renvoie undefined.

Mises en garde

Utilisation

Mesurer la disposition avant que le navigateur ne redessine l'écran

La plupart des composants n'ont pas besoin de connaître leur position et leur taille à l'écran pour déterminer le rendu. Ils renvoient simplement du code JSX. Le navigateur calcule ensuite leur disposition (position et taille) et redessine l'écran.

Parfois, cela ne suffit pas. Imaginez une info-bulle qui apparaît à côté d'un élément au survol. Si l'espace est suffisant, l'info-bulle devrait apparaître au-dessus de l'élément, mais si elle ne rentre pas, elle devrait apparaître en dessous. Pour que l'info-bulle soit affichée à la bonne position finale, vous devez connaître sa hauteur (c'est-à-dire si elle tient en haut).

Pour ce faire, vous devez effectuer le rendu en deux étapes :

Afficher à nouveau l'info-bulle au bon endroit.

Tout cela doit être effectué avant que le navigateur ne redessine l'écran. L'utilisateur ne doit pas voir l'info-bulle bouger. Appelez useLayoutEffect pour effectuer les mesures de mise en page avant que le navigateur ne repeigne l'écran :

  1. function Tooltip() {
  2.   const ref = useRef(null);
  3.   const [tooltipHeight, setTooltipHeight] = useState(0); // Vous ne connaissez pas encore la vraie taille
  4.  
  5.   useLayoutEffect(() => {
  6.     const { height } = ref.current.getBoundingClientRect();
  7.     setTooltipHeight(height); // Re-rendez maintenant que vous connaissez la hauteur réelle
  8.   }, []);
  9.  
  10.   // ...utilisez tooltipHeight dans la logique de rendu ci-dessous...
  11. }

Voici comment cela fonctionne étape par étape :



Dernière mise à jour : Mercredi, le 10 septembre 2025