ReactJS
Cette liste de bonne pratique est surtout un retour sur certaines "mauvaise pratiques" que nous avons mis dans notre code et comment les corriger.
Nombre de composants par fichiers composants
Un fichier "composant" ne DEVRAIT pas avoir plus d'un composant dedans :
- Pas bien 👎
- Bien 👍
Intérêt
Le but est de trouver le bon composant quand on ouvre le fichier en question, en pas de trouver plusieurs composants sans trouver celui qui est censé être là.
Cas des "conteneurs" / "injecteurs"
Nommage de méthodes
Un méthode "répondant" à un évènement onSomething
DEVRAIT être préfixée par handle
.
render
bind(this) dans la methode Le binding javascript n'est pas simple.
Les nouvelles fonctionnalités d'ECMAScript permettent de se rapprocher des autres langages et de ne plus avoir à connaitre les "internes", et c'est plutôt bien (même si c'est encore mieux de connaitre comment ça fonctionne sous le capôt).
Pour cette raison, le binding
et les appels de méthodes DEVRAIENT être le plus "simple" et le plus "logique" pour les débutants.
Cela facilite aussi la lisibilité et la compréhension pour les développeurs chevronnés.
- Pas bien 👎
- Bien 👍
render
Composant "classe" : fonctions anonymes dans la methode De la même manière, on NE DOIT PAS créer des fonctions anonymes dans la méthode render
.
Explications
- Les fonctions anonymes sont regénérées à chaque appel de
render
, ce qui consomme de la ressource pour rien. - Cela rend la méthode
render
moins lisible car il y a du code "métier" dans le rendu.
- Pas bien 👎
- Bien 👍
Exception
La seule exception étant si l'on est en train d'itérer sur une liste et que l'on doit passer un object en paramètre.
On DOIT dans tous les cas limiter la fonction anonyme à un appel d'une autre méthode pour la lisibilité.
On PEUT alors faire comme ça:
Hooks : définitions des fonctions de "setters"
À l'instar des composants de classe, on NE DEVRAIT PAS de définir des fonctions dans le corps du rendu de la méthode pour faire des actions simples:
- Pas bien 👎
- Bien 👍
Explication
- Dans tous les cas la fonction est regénérée à chaque rendu
- Le fait de définir une fonction supplémentaire peut complexifier la compréhension pour des cas simple
Attention
Il est par contre important d'extraire une fonction personnalisée quand le code devient complexe auquel cas la lisibilité du rendu du composant s'en trouverait diminuée.
Hooks : extraction de hooks personnalisés
On DEVRAIT extraire les hooks personnalisés dans les cas suivants :
- Quand les "hooks" prennent plus de 40% de la taille du composant : extraire dans des hooks par "blocs fonctionnels"
- Quand plusieurs "hooks" ont des "périmètres fonctionnels" différents, sortir les hooks par blocs fonctionnels différents
Il est très facile à extraire des hooks : il suffit de copier coller tout son code dans une autre fonction.
- Pas bien 👎
- Bien 👍
Intérêt
Une meilleure lisibilité du composant, possibilité de tester les hooks.
Les hooks personnalisés PEUVENT être situés dans le fichier à côté du composant si ils restent petits et "privés".
Ils DEVRAIENT être dans un fichiers autonome dans le dossier du composant si ils sont "privés" mais complexes (plus de ~50 lignes).
Ils PEUVENT être situés dans un dossier / fichier partagés si ils sont utilisables par plusieurs composants. Dans ce cas ils DEVRAIENT être au plus près de leur utilisation métier. (un "hook" concernant uniquement les paniers devrait se trouver avec le code des paniers, et pas à la racine).
useState
multiples
Hooks : On NE DEVRAIT PAS utiliser useState
plusieurs fois autour du même "bloc fonctionnel", mais on DEVRAIT utiliser useReducer
dans ce cas.
- Pas bien 👎
- Bien 👍
Intérêt
- Pouvoir modifier facilement en ajoutant une clé, ou un cas sans avoir un "setter" qui est mal (ré-)initialisé.
- Avoir la liste de tous les cas et les actions lisibles facilement sans avoir besoin de comprendre la logique sous-jacente.