useInsertionEffect |
Utilise un effet d'insertion |
|---|---|
| React | |
Piège : useInsertionEffect est destiné aux créateurs de bibliothèques CSS-in-JS. À moins que vous ne travailliez sur une bibliothèque CSS-in-JS et que vous ayez besoin d'un emplacement pour injecter les styles, vous préférerez probablement useEffect ou useLayoutEffect.
| useInsertionEffect(setup, dependencies?) |
Description
useInsertionEffect permet d'insérer des éléments dans le DOM avant le déclenchement des effets de mise en page.
Référence
| useInsertionEffect( , dependencies?) |
Appelez useInsertionEffect pour insérer des styles avant le déclenchement de tout effet pouvant nécessiter la lecture de la mise en page :
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). Lorsque votre composant est ajouté au DOM, mais avant le déclenchement de tout effet de mise en page, React exécute votre fonction de configuration. Après chaque rendu avec des dépendances modifiées, React exécute d'abord la fonction de nettoyage (si vous l'avez fournie) avec les anciennes valeurs, puis la fonction de configuration avec les nouvelles valeurs. Lorsque votre composant est supprimé du DOM, React exécute la 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érifie 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 compare chaque dépendance à sa valeur précédente grâce à l'algorithme de comparaison Object.is. Si vous ne spécifiez pas du tout les dépendances, votre effet sera réexécuté après chaque nouveau rendu du composante. |
Renvoie
useInsertionEffect renvoie undefined.
Avertissements
- Les effets ne s'exécutent que sur le client. Ils ne s'exécutent pas pendant le rendu serveur.
- Vous ne pouvez pas mettre à jour l'état depuis useInsertionEffect.
- Lors de son exécution, les références ne sont pas encore attachées.
- useInsertionEffect peut s'exécuter avant ou après la mise à jour du DOM. Il est déconseillé de compter sur une mise à jour du DOM à un moment précis.
- Contrairement aux autres types d'effets, qui lancent le nettoyage puis la configuration pour chaque effet, useInsertionEffect lance le nettoyage et la configuration une composante à la fois. Cela crée un « entrelacement » des fonctions de nettoyage et de configuration.
Utilisation
Injection de styles dynamiques à partir de bibliothèques CSS-in-JS
Traditionnellement, le style des composantes React est appliqué en CSS brut.
Certaines équipes préfèrent créer des styles directement dans le code JavaScript plutôt que d'écrire des fichiers CSS. Cela nécessite généralement l'utilisation d'une bibliothèque ou d'un outil CSS-in-JS. Il existe trois approches courantes pour CSS-in-JS :
- Extraction statique vers des fichiers CSS avec un compilateur
- Styles en ligne, par exemple <div style={{ opacité : 1 }}>
- Injection d'exécution de balises <style>
Si vous utilisez CSS-in-JS, nous recommandons une combinaison des deux premières approches (fichiers CSS pour les styles statiques, styles en ligne pour les styles dynamiques). Nous déconseillons l'injection de balises <style> à l'exécution pour deux raisons :
- L'injection à l'exécution force le navigateur à recalculer les styles beaucoup plus souvent.
- L'injection à l'exécution peut être très lente si elle se produit au mauvais moment du cycle de vie de React.
- Le premier problème est insoluble, mais useInsertionEffect vous aide à résoudre le second.
Appelez useInsertionEffect pour insérer les styles avant tout effet de mise en page :
- // À l'intérieur de votre bibliothèque CSS-in-JS
- let isInserted = new Set();
- function useCSS(rule) {
- useInsertionEffect(() => {
- // Comme expliqué précédemment, nous ne recommandons pas l'injection d'exécution de balises <style>.
- // Mais si vous devez le faire, il est important de le faire dans useInsertionEffect.
- if (!isInserted.has(rule)) {
- isInserted.add(rule);
- document.head.appendChild(getStyleForRule(rule));
- }
- });
- return rule;
- }
-
- function Button() {
- const className = useCSS('...');
- return <div className={className} />;
- }
Tout comme useEffect, useInsertionEffect ne s'exécute pas sur le serveur. Si vous souhaitez collecter les règles CSS utilisées sur le serveur, vous pouvez le faire pendant le rendu :