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?
3 Réponses :
classes.appBarShift
ne sera appliqué que si open
true
. Si le tableau a plus de classes, toutes seront appliquées si open
true
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 })
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
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 })}
Pouvez-vous s'il vous plaît ajouter une explication à votre code? Les réponses basées uniquement sur le code peuvent relever de «Très faible qualité» ... et sont candidates à la suppression ... Nous avons toujours vanté que nous ne sommes pas une fabrique de codes. Nous sommes les gens qui apprennent aux autres à pêcher. Les réponses au code uniquement ne nourrissent une personne que pendant une journée