32
votes

Comment utiliser clsx dans React

J'essaie de comprendre certaines utilisations de clsx dans l'attribution de noms de classe à un composant dans React.

La construction

className={clsx(classes.appBar, {[classes.appBarShift]: open })}

est assez clair. Il applique 'classes.menuButton', et applique également 'classes.hide' si la valeur du booléen 'open' est true.

Ma question porte sur ce deuxième exemple:

className={clsx(classes.menuButton, open && classes.hide)} 

Cela s'appliquera 'classes.appBar'. Mais quelle est la signification du deuxième paramètre?


0 commentaires

3 Réponses :


2
votes

classes.appBarShift ne sera appliqué que si open true . Si le tableau a plus de classes, toutes seront appliquées si open true


0 commentaires

46
votes

clsx est généralement utilisé pour appliquer conditionnellement un nom de className donné

Cette syntaxe signifie qu'une classe ne sera appliquée que si une condition donnée est évaluée à true

const { foo, bar, baz } = classes
const style = clsx(foo, bar, baz)

return <div className={style} />

Dans cet exemple, [classes.menuOpen] (qui évaluera à quelque chose comme randomclassName123 ) ne sera appliqué que si open === true


clsx effectue essentiellement une interpolation de string . Vous n'êtes donc pas obligé de l'utiliser pour appliquer des classes de manière conditionnelle.

Il existe de nombreuses syntaxes prises en charge que vous pouvez vérifier dans la documentation officielle

Au lieu de

<div className={`${classes.foo} ${classes.bar} ${classes.baz}`} />

Vous pouvez l'utiliser comme ça

const menuStyle = clsx({
    [classes.root] : true, //always applies
    [classes.menuOpen] : open //only when open === true
})


6 commentaires

Merci. Si je vous comprends bien, alors «open && classes.menuOpen» a exactement le même effet que «[classes.menuOpen]: open».


Ouais. Ce ne sont que deux façons différentes d'obtenir le même résultat


Merci encore. Dernier commentaire - La construction 'className = {clsx (classes.appBar, {[classes.appBarShift]: open})}' aurait le même effet que 'className = {clsx (classes.appBar, {classes.appBarShift: open} )} '. Le tableau n'est vraiment nécessaire que lorsqu'il y a plus d'une règle dépendante de la valeur de open.


Oui. Vous pouvez vérifier tous les sintaxes possibles pour clsx ici


Non ... la syntaxe du tableau est pour les clés dynamiques: stackoverflow.com/a/19837961/3494249 {classes.appBarShift: open} provoquerait une erreur; {[classes.appBarShift]: open} créerait un objet avec la valeur classes.appBarShift comme clé.


Il se réfère à passer un tableau de classes à clsx . Les clés dynamiques n'ont rien à voir avec cela. Oui, son exemple de code échouera faute de [] délimitant la clé. Mais ce n'était pas sa question



5
votes

Beaucoup de gens l'ont déjà assez bien expliqué. Je voulais toujours ajouter un exemple contenant className. Dans l'exemple, vous pouvez voir différentes classes, appliquées si une condition donnée est évaluée à true. Dans l'exemple, vous pouvez appliquer une classe avec une valeur booléenne, une variable booléenne ou une chaîne comparée (si match, retourne true). La classe classes.drawer est toujours appliquée et ne dépend pas d'une condition.

className={clsx(classes.drawer, {                  // classes.drawer is applied always
          [classes.drawerOpen]: true,              // classes.drawerOpen is applied always, bool = true
          [classes.drawerClose]: !open,            // you can also use boolean variable
          [classes.drawerRed]: colorVar === 'red', // you can also use string variable
        })}