Construire des composants React réutilisables en utilisant Tailwind
Dans cet article, nous verrons plusieurs façons différentes de créer des composants React réutilisables qui exploitent Tailwind sous le capot tout en exposant une interface agréable à d'autres composants. Cela améliorera votre code en passant de longues listes de noms de classe à des accessoires sémantiques plus faciles à lire et à maintenir.
Vous devrez avoir travaillé avec React afin d'avoir une bonne compréhension de ce message.
Tailwind est un framework CSS très populaire qui fournit des classes utilitaires de bas niveau pour aider les développeurs à créer des conceptions personnalisées. Il a gagné en popularité au cours des dernières années, car il résout très bien deux problèmes:
- Tailwind facilite la modification itérative du code HTML sans parcourir les feuilles de style pour trouver des sélecteurs CSS correspondants.
- Tailwind a des conventions et des valeurs par défaut saines. Cela permet aux gens de commencer facilement sans écrire CSS à partir de zéro.
Ajoutez la documentation complète et il n'est pas surprenant que Tailwind soit si populaire.
Ces méthodes vous aideront à transformer du code qui ressemble à ceci:
Pour un code qui ressemble à ceci:
La différence entre les deux extraits est que dans le premier, nous avons utilisé une balise de bouton HTML standard, tandis que le second a utilisé un composant . Le composant
avait été conçu pour être réutilisable et est plus facile à lire car il a une meilleure sémantique. Au lieu d'une longue liste de noms de classe, il utilise des propriétés pour définir divers attributs tels que
taille
textColor
et bgColor
.
Commençons.
Méthode 1: Contrôle des classes avec le module Classnames
Un moyen simple d'adapter Tailwind dans une application React est d'embrasser les noms de classe et de les basculer par programme.
Le module classnames npm fait il est facile de basculer entre les classes dans React. Pour montrer comment vous pouvez l'utiliser, prenons un cas d'utilisation dans lequel vous avez composants dans votre application React.
// Cela peut être difficile à lire.
// C'est React plus conventionnel.
Voyons comment séparer les classes Tailwind pour que les utilisateurs de ce composant puissent utiliser des accessoires React tels que
size
textColor
et bgColor
.
- Passez des accessoires tels que
bgColor
ettextColor
directement dans le modèle de chaîne de nom de classe. - Utilisez des objets pour changer de nom de classe par programmation (comme nous l'avons fait avec le
taille
prop)
Dans l'exemple de code ci-dessous, nous allons examiner les deux approches.
// Button.jsx
importer des noms de classe à partir de 'classnames';
Bouton de fonction ({size, bgColor, textColor, children}) {
revenir (
)
};
bouton d'exportation par défaut;
Dans le code ci-dessus, nous définissons un composant Button
qui prend les accessoires suivants:
size
Définit la taille du bouton et applique les classes Tailwindtext-xs
outext-xl
-
bgColor
Définit la couleur d'arrière-plan du bouton et applique les classes Tailwindbg - *
. -
textColor
Définit la couleur du texte du bouton et applique les classes text- * Tailwind -
enfants
Tous les sous-composants seront passés ici. Il contiendra généralement le texte dans.
En définissant Button.jsx
nous pouvons maintenant l'importer et utiliser des accessoires React au lieu des noms de classe. Cela rend notre code plus facile à lire et à réutiliser.
import Button from './Button';
Utilisation des noms de classe pour les composants interactifs
Un bouton est un cas d'utilisation très simple. Et quelque chose de plus compliqué? Eh bien, vous pouvez aller plus loin pour créer des composants interactifs.
Par exemple, regardons une liste déroulante réalisée à l'aide de Tailwind.
Une liste déroulante interactive construite à l'aide de Tailwind et du changement de nom de classe.
Pour cet exemple, nous créons le composant HTML à l'aide des noms de classe CSS Tailwind mais nous exposons un composant React qui ressemble à ceci:
{
console.log ("Option sélectionnée", option)}
}
/>
En regardant le code ci-dessus, vous remarquerez que nous n'avons pas de classes Tailwind. Ils sont tous cachés dans le code d'implémentation de
. L'utilisateur de ce composant Dropdown
n'a qu'à fournir une liste d'options
et un gestionnaire de clics, onOptionSelect
quand une option
est cliquée.
Voyons comment ce composant peut être construit à l'aide de Tailwind.
Suppression d'une partie du code non lié, voici l'essentiel de la logique. Vous pouvez voir ce Codepen pour un exemple complet.
import classNames from 'classnames';
fonction Dropdown ({options, onOptionSelect}) {
// Gardez une trace si la liste déroulante est ouverte ou non.
const [isActive, setActive] = useState (false);
const buttonClasses = `inline-flex justification-centre w-full arrondi-md border border-grey-300 px-4 py-2 bg-white text-sm Leading-5 font-medium text-grey-700 hover: text-grey -500 focus: contour-aucun focus: bordure-bleu-300 focus: ombre-contour-bleu actif: bg-bleu-500 actif: texte-gris-200 transition facilité-in-out durée-150`;
revenir (
// Bascule la liste déroulante si le bouton est cliqué
// Utilisez le module classnames pour basculer les classes Tailwind .block et .hidden
// Les éléments de liste sont rendus ici.
{options.map ((option) => onOptionSelect (option)}> {option} )}
)
}
exporter la liste déroulante par défaut;
La liste déroulante est rendue interactive en la montrant ou en la masquant de manière sélective à l'aide des classes .hidden
et .block
. Chaque fois que le est enfoncé, nous tirons le gestionnaire
onClick
qui bascule l'état isActive
. Si le bouton est actif ( isActive === true
), nous définissons la classe de bloc
. Sinon, nous définissons la classe cachée
. Il s'agit des deux classes Tailwind pour basculer le comportement d'affichage .
En résumé, le module classnames est un moyen simple et efficace de contrôler par programme les noms de classe pour Tailwind. Il facilite la séparation de la logique en accessoires React, ce qui facilite la réutilisation de vos composants. Il fonctionne pour des composants simples et interactifs.
Méthode 2: Utilisation de constantes pour définir un système de conception
Une autre façon d'utiliser Tailwind et React ensemble consiste à utiliser des constantes et à mapper des accessoires à une constante spécifique. Ceci est efficace pour les systèmes de conception de bâtiments. Voyons un exemple.
Commencez avec un fichier theme.js
où vous répertoriez votre système de conception.
// theme.js (vous pouvez l'appeler comme vous voulez)
export const ButtonType = {
primaire: "bg-blue-500 hover: bg-blue-700 text-white font-bold arronded",
secondaire: "bg-blue-500 hover: bg-blue-700 text-white font-bold arronded",
basic: "bg-white hover: bg-grey-700 text-grey-700 font-bold arronded",
supprimer: "bg-red-300 survoler: bg-red-500 texte-blanc police-gras arrondi"
};
export const Const ButtonSize = {
sm: "py-2 px-4 text-xs",
lg: "py-3 px-6 text-lg"
}
Dans ce cas, nous avons deux ensembles de constantes:
ButtonType
définit le style des boutons dans notre application.-
ButtonSizes
définit les tailles des boutons dans notre application. [19659042] Maintenant, écrivons notre composant:
import {ButtonType, ButtonSize} de './theme'; Bouton de fonction ({taille, type, enfants}) { // Cela peut être amélioré. Je reste simple ici en joignant deux chaînes. const classNames = ButtonType [type] + "" + ButtonSize [size]; revenir ( ) } bouton d'exportation par défaut;
Nous utilisons les constantes
ButtonType
etButtonSize
pour créer une liste de noms de classe. Cela rend l'interface de notrebeaucoup plus agréable. Il nous permet d'utiliser des accessoires de type
de taille
et// Des accessoires plus propres et bien définis.
Par rapport à l'approche précédente:
// Exposition des noms de classe
Si vous devez redéfinir l'apparence des boutons dans votre application, modifiez simplement le fichier
theme.js
et tous les boutons de votre application seront automatiquement mis à jour. Cela peut être plus facile que de rechercher des noms de classe dans divers composants.Méthode 3: Composer des utilitaires avec
@apply
Une troisième façon d'améliorer la lisibilité de vos composants React consiste à utiliser CSS et le
@apply
modèle disponible dans PostCSS pour extraire des classes répétées. Ce modèle implique l'utilisation de feuilles de style et de post-processeurs.Voyons comment cela fonctionne à travers un exemple. Supposons que vous ayez un groupe de boutons qui a un bouton principal et un bouton secondaire.
Un groupe de boutons composé d'un bouton principal et secondaire. ( Grand aperçu ) En utilisant le modèle
@apply
vous pouvez écrire ce code HTML comme:Qui peut ensuite être adopté pour React pour devenir:
importez des noms de classe à partir de "noms de classe"; Bouton de fonction ({taille, type, enfants}) { const bSize = "btn-" + taille; const bType = "btn-" + type; revenir ( ) } Button.propTypes = { taille: PropTypes.oneOf (['xs, xl']), type: PropTypes.oneOf (['primary', 'secondary']) }; // Utilisation du composant Button.
Voici comment créer ces noms de classe de style BEM tels que
.btn
.btn-primary
etc. Commencez par créer un fichierbutton.css
:/ * button.css * / @tailwind base; @tailwind components; .btn { @apply py-2 px-4 mr-4 police-bold arrondie; } .btn-primary { @apply bg-blue-500 hover: bg-blue-700 text-white; } .btn-secondaire { @apply hover: bg-gray-700 text-grey-700 border-grey-300 border; } .btn-xs { @apply text-xs; } .btn-xl { @apply text-xl; } @tailwind utilities;
Le code ci-dessus n'est pas réel CSS mais il sera compilé par PostCSS . Il y a un référentiel GitHub disponible ici qui montre comment configurer PostCSS et Tailwind pour un projet JavaScript.
Il y a aussi une courte vidéo qui montre comment le configurer ici . [19659092] Inconvénients de l'utilisation de
@apply
Le concept d'extraction de classes utilitaires Tailwind dans des classes CSS de niveau supérieur semble logique, mais il présente certains inconvénients dont vous devez être conscient. Soulignons-les avec un autre exemple.
Premièrement, en extrayant ces noms de classe, nous perdons des informations. Par exemple, nous devons être conscients que
.btn-primary
doit être ajouté à un composant auquel.btn
a déjà été appliqué. En outre,.btn-primaire
et.btn-secondaire
ne peuvent pas être appliqués ensemble. Cette information n'est pas évidente en regardant simplement les classes.Si cette composante était quelque chose de plus compliqué, vous auriez également besoin de comprendre la relation parent-enfant entre les classes. D'une certaine manière, c'est le problème que Tailwind a été conçu pour résoudre et en utilisant
@apply
nous rapportons les problèmes d'une manière différente.Voici une vidéo où Adam Wathan – le créateur de Tailwind – plonge dans les avantages et les inconvénients de l'utilisation
@apply
.Résumé
Dans cet article, nous avons examiné trois façons dont vous pouvez intégrer Tailwind dans une application React pour créer des composants réutilisables. Ces méthodes vous aident à créer des composants React qui ont une interface plus propre à l'aide des accessoires
- Utilisez le module classnames pour basculer par programme entre les classes.
- Définissez un fichier de constantes dans lequel vous définissez une liste de classes par état de composant.
- Utilisez
@apply
pour extraire des classes CSS de niveau supérieur.
Si vous avez des questions, envoyez-moi un message sur Twitter à @tilomitra .
Lecture recommandée sur SmashingMag:
(ks, ra, il)
Source link