Table des matières
ToggleArticle 1

Render Props
Dans le développement d’applications React, il est essentiel de gérer la réutilisation de la logique de manière efficace. Une des techniques puissantes pour cela est l’utilisation des Render Props. Ce concept permet de partager des comportements ou des fonctionnalités entre différents composants de manière flexible et propre. Cet article va explorer en profondeur ce que sont les Render Props, comment les utiliser, et quels avantages elles offrent dans le contexte de ReactJS.
1. Qu’est-ce qu’une Render Prop ?
Une Render Prop est une technique dans React où un composant prend une fonction en prop et l’utilise pour rendre un ou plusieurs éléments. Ce pattern permet de partager des comportements ou des logiques d’interaction entre plusieurs composants sans les lier de manière rigide. Au lieu de définir un rendu statique dans un composant, on peut passer une fonction à un composant qui la rendra à son tour.
Exemple simple
Prenons un exemple de composant qui utilise une Render Prop pour afficher un message avec des données dynamiques :
import React, { useState } from ‘react’;
// Composant avec Render Prop
const Message = ({ render }) => {
return <div>{render()}</div>;
};
// Composant parent
const App = () => {
const [name, setName] = useState(‘John’);
return (
<Message render={() => <h1>Bonjour, {name}!</h1>} />
);
};
export default App;
Dans cet exemple, le composant Message
prend une prop render
qui est une fonction. Le composant parent (App
) passe une fonction qui génère le message à afficher. C’est ici que le principe de la Render Prop prend tout son sens : le composant Message
se contente d’exécuter cette fonction pour afficher le contenu, sans avoir de logique spécifique à l’affichage.
2. Comment fonctionnent les Render Props ?
Une Render Prop permet de séparer la logique de la présentation. Elle offre un moyen de partager des comportements entre plusieurs composants tout en laissant le composant parent décider de ce qui sera effectivement rendu.
Composant avec gestion de la logique
Prenons l’exemple d’un composant qui gère un état, comme un compteur, et qui le passe à son enfant via une Render Prop :
import React, { useState } from ‘react’;
// Composant qui gère la logique
const Counter = ({ render }) => {
const [count, setCount] = useState(0);
const increment = () => setCount(count + 1);
return (
<div>
{render(count, increment)}
</div>
);
};
// Composant parent qui utilise la Render Prop
const App = () => {
return (
<Counter render={(count, increment) => (
<div>
<h1>Compteur: {count}</h1>
<button onClick={increment}>Incrémenter</button>
</div>
)} />
);
};
export default App;
Explication
- Composant
Counter
: Ce composant gère l’état du compteur (count
) et fournit une fonctionincrement
pour le mettre à jour. - Render Prop : Le composant
Counter
utilise une proprender
qui est une fonction. Cette fonction reçoit l’état actuel (count
) et la fonctionincrement
, puis elle peut rendre un élément en utilisant ces informations. - Composant
App
: Le composant parent passe la fonction àCounter
, qui utilise ces données pour afficher un bouton permettant d’incrémenter le compteur.
Ce mécanisme de Render Props permet de centraliser la logique de gestion d’état (ici, le compteur) tout en permettant au parent de décider de l’interface utilisateur. Ce modèle améliore la réutilisabilité et la séparation des préoccupations.
3. Avantages des Render Props
Les Render Props offrent plusieurs avantages qui en font une technique populaire dans le développement avec ReactJS.
3.1. Réutilisabilité
Les Render Props permettent de créer des composants réutilisables qui peuvent être partagés entre différentes parties de l’application, tout en étant flexibles. Par exemple, un composant qui gère un état comme un compteur peut être réutilisé dans différentes situations, simplement en passant des Render Props adaptées à chaque cas.
3.2. Séparation de la logique et de la présentation
L’un des avantages majeurs des Render Props est qu’elles permettent de séparer la logique métier (comme la gestion de l’état ou des événements) de la présentation. Cela donne aux développeurs plus de liberté pour créer des interfaces modulaires et réutilisables.
3.3. Comportement dynamique
Les Render Props permettent de rendre des composants dynamiques, car la fonction passée peut être définie en fonction de l’état, des props ou des événements. Cela rend les composants plus flexibles et capables de répondre à des changements en temps réel.
3.4. Composition facile
Les Render Props sont également très efficaces pour la composition de composants. Vous pouvez imbriquer plusieurs Render Props pour gérer des comportements complexes de manière très modulaire.
4. Inconvénients des Render Props
Bien que puissantes, les Render Props ne sont pas sans inconvénients. Il est important de les utiliser judicieusement.
4.1. Composants imbriqués
L’un des inconvénients majeurs des Render Props est que l’on peut rapidement se retrouver avec des chaînes de composants imbriqués. Cela peut rendre le code plus difficile à lire et à maintenir, surtout lorsqu’il y a plusieurs niveaux d’imbrication.
4.2. Performance
Lorsque plusieurs Render Props sont utilisées, React doit réévaluer chaque prop de chaque composant à chaque changement d’état, ce qui peut potentiellement nuire aux performances si mal utilisé. Il est important de bien optimiser les rendus pour éviter les re-rendus inutiles.
5. Exemple avancé : Animation avec Render Props
Imaginons un cas d’usage où nous souhaitons créer une animation avec une Render Prop. Le composant Animate
gère la logique de l’animation, et l’enfant peut définir comment rendre l’élément animé.
import React, { useState, useEffect } from ‘react’;
// Composant qui gère l’animation
const Animate = ({ render }) => {
const [position, setPosition] = useState(0);
useEffect(() => {
const interval = setInterval(() => {
setPosition((prev) => (prev + 5) % 100);
}, 100);
return () => clearInterval(interval);
}, []);
return render(position);
};
// Composant parent
const App = () => {
return (
<Animate render={(position) => (
<div style={{ transform: `translateX(${position}%)`, transition: ‘transform 0.1s linear’ }}>
Je me déplace !
</div>
)} />
);
};
export default App;
Explication
- Composant
Animate
: Ce composant gère la position de l’élément animé avec unuseState
et unuseEffect
pour mettre à jour la position toutes les 100 ms. - Render Prop : La fonction passée à la prop
render
reçoit la position actuelle de l’élément et rend un élément qui utilise cette position pour animer l’élément viatransform: translateX()
.
Cet exemple montre la puissance des Render Props pour gérer des comportements complexes comme les animations tout en gardant la logique séparée de l’interface utilisateur.
6. Conclusion
Les Render Props sont un concept puissant dans React qui permet de partager la logique de manière flexible et réutilisable. Elles permettent de séparer la logique de la présentation, de gérer dynamiquement le rendu, et de créer des composants modulaires. Cependant, comme pour toute technique, il est important de les utiliser avec soin pour éviter les problèmes de performance et de lisibilité du code.
En utilisant les Render Props, vous pouvez améliorer la réutilisabilité et la modularité de vos composants React, en particulier dans des cas où la gestion de la logique ou de l’état est complexe.
Article 2

Higher Order Components (HOC)
Les Higher Order Components (HOC) sont un concept fondamental dans l’écosystème React, utilisé pour partager des fonctionnalités entre plusieurs composants de manière efficace. Ce modèle permet de créer des composants réutilisables et d’augmenter la modularité de votre application. Dans cet article, nous allons explorer ce que sont les HOC, comment les utiliser, et pourquoi ils sont importants dans le développement d’applications React.
1. Qu’est-ce qu’un Higher Order Component (HOC) ?
Un Higher Order Component (HOC) est une fonction qui prend un composant en entrée et retourne un nouveau composant avec des fonctionnalités supplémentaires. Le HOC n’affecte pas le composant d’origine mais l’enrichit avec des props supplémentaires ou de la logique.
L’idée derrière les HOC est de créer des composants qui partagent des fonctionnalités communes (comme la gestion de l’état, la gestion des événements, ou l’accès aux données) et qui peuvent être facilement réutilisés dans différentes parties de l’application.
Syntaxe d’un HOC
Voici la syntaxe générale d’un HOC en React :
const withFeature = (WrappedComponent) => { return (props) => { // Ajoutez des fonctionnalités supplémentaires ici return <WrappedComponent {…props} />; }; };
Le HOC prend un composant WrappedComponent
en argument et retourne un nouveau composant qui peut ajouter des comportements ou des props supplémentaires à WrappedComponent
.
2. Exemple de HOC simple
Prenons un exemple simple où un HOC ajoute une fonctionnalité de compteur à un composant existant.
Création du HOC
import React, { useState } from ‘react’;
// HOC qui ajoute un compteur
const withCounter = (WrappedComponent) => {
return (props) => {
const [count, setCount] = useState(0);
const increment = () => setCount(count + 1);
return <WrappedComponent {…props} count={count} increment={increment} />;
};
};
export default withCounter;
Composant de base
Voici un composant simple qui affiche un message et un bouton pour incrémenter un compteur :
import React from ‘react’;
import withCounter from ‘./withCounter’;
const DisplayCounter = ({ count, increment }) => (
<div>
<h1>Le compteur est à : {count}</h1>
<button onClick={increment}>Incrémenter</button>
</div>
);
export default withCounter(DisplayCounter);
Utilisation du HOC
Dans l’exemple ci-dessus, le composant DisplayCounter
est « emballé » avec le HOC withCounter
, qui lui fournit un état count
et une fonction increment
. Ce HOC peut être appliqué à n’importe quel composant pour lui ajouter la fonctionnalité de compteur.
Le composant final
Le composant final avec le compteur fonctionne ainsi :
import React from ‘react’;
import DisplayCounter from ‘./DisplayCounter’;
const App = () => {
return <DisplayCounter />;
};
export default App;
Quand vous exécutez l’application, le composant DisplayCounter
affiche un compteur et un bouton pour l’incrémenter, mais la logique de gestion du compteur est complètement séparée et encapsulée dans le HOC withCounter
.
3. Pourquoi utiliser les HOC ?
3.1. Réutilisabilité
Les HOC permettent de réutiliser de la logique entre plusieurs composants sans dupliquer le code. Par exemple, au lieu de répéter la logique de gestion d’un compteur dans plusieurs composants, vous pouvez encapsuler cette logique dans un HOC réutilisable.
3.2. Modulaire
Les HOC permettent de structurer une application de manière modulaire, car ils ajoutent des fonctionnalités spécifiques de manière isolée sans modifier directement le composant d’origine.
3.3. Séparation des préoccupations
Avec les HOC, vous pouvez séparer la logique métier (comme l’accès aux API, la gestion de l’état, ou la gestion des événements) de la présentation du composant. Cela améliore la lisibilité et la maintenance du code.
3.4. Encapsulation de comportements transversaux
Les HOC sont particulièrement utiles pour encapsuler des comportements transversaux (comme la gestion de l’authentification, le suivi des erreurs ou la gestion de la logique de chargement) qui doivent être partagés entre plusieurs composants.
4. Exemple avancé : HOC pour la gestion de l’authentification
Supposons que nous ayons un composant qui nécessite une authentification avant d’afficher son contenu. Un HOC peut être utilisé pour vérifier si un utilisateur est authentifié et gérer l’affichage en fonction de cet état.
HOC de vérification d’authentification
import React from ‘react’;
import { Navigate } from ‘react-router-dom’;
// HOC pour protéger un composant avec une authentification
const withAuth = (WrappedComponent) => {
return (props) => {
const isAuthenticated = false; // On pourrait remplacer cela par un vrai check d’authentification
if (!isAuthenticated) {
return <Navigate to= »/login » />;
}
return <WrappedComponent {…props} />;
};
};
export default withAuth;
Composant protégé
import React from ‘react’;
import withAuth from ‘./withAuth’;
const ProtectedComponent = () => (
<div>
<h1>Bienvenue sur la page protégée!</h1>
</div>
);
export default withAuth(ProtectedComponent);
Utilisation dans l’application
import React from ‘react’; import ProtectedComponent from ‘./ProtectedComponent’; const App = () => { return ( <div> <ProtectedComponent /> </div> ); }; export default App;
Explication
Dans cet exemple, le HOC withAuth
vérifie si l’utilisateur est authentifié avant de permettre l’affichage du ProtectedComponent
. Si l’utilisateur n’est pas authentifié, il est redirigé vers une page de connexion. Cela permet de protéger l’accès à certaines parties de l’application de manière centralisée et réutilisable.
5. Bonnes pratiques avec les HOC
5.1. Ne pas modifier le comportement d’un composant directement
Les HOC doivent être utilisés pour ajouter de nouvelles fonctionnalités ou modifier le comportement d’un composant sans modifier directement son code. Cela permet de préserver la modularité et la réutilisabilité.
5.2. Nommer les HOC de manière explicite
Il est important de donner aux HOC des noms explicites qui indiquent clairement les fonctionnalités qu’ils ajoutent. Par exemple, withAuth
pour un HOC qui ajoute une logique d’authentification ou withLoading
pour un HOC qui gère l’état de chargement.
5.3. Ne pas trop imbriquer les HOC
L’un des risques liés aux HOC est qu’une imbrication excessive peut rendre le code difficile à lire et à maintenir. Essayez de limiter le nombre de HOC imbriqués et de trouver des moyens de les combiner de manière claire et lisible.
6. Limites des HOC
6.1. Complexité croissante
Bien que les HOC apportent une grande flexibilité, leur utilisation excessive peut rendre le code difficile à suivre. En particulier, lorsque plusieurs HOC sont imbriqués, il peut devenir compliqué de suivre le flux de données et de logique.
6.2. Problèmes de prop drilling
L’utilisation de HOC peut entraîner des problèmes de prop drilling, où des données doivent être passées par plusieurs niveaux de composants, ce qui peut rendre le code moins maintenable. Cependant, des solutions comme Context API ou State management libraries (Redux, MobX, etc.) peuvent aider à atténuer ce problème.
7. Conclusion
Les Higher Order Components (HOC) sont un puissant mécanisme de réutilisation de la logique dans React. Ils permettent de découpler la gestion des fonctionnalités transversales (comme l’authentification, la gestion de l’état, ou la manipulation des props) de la présentation des composants, rendant ainsi l’application plus modulaire, lisible et maintenable. Cependant, comme pour toute technologie, il est important de les utiliser avec parcimonie pour éviter la complexité excessive.
En suivant les bonnes pratiques et en restant conscient de leurs limites, les HOC peuvent être un atout précieux dans la gestion des fonctionnalités partagées au sein de vos applications React.