Estoy tratando de entender algunos usos de clsx al asignar nombres de clase a un componente en React.
El constructo
className={clsx(classes.menuButton, open && classes.hide)}es lo suficientemente claro. Aplica 'classes.menuButton' y también aplica 'classes.hide' si el valor del booleano 'open' es verdadero.
Mi pregunta se relaciona con este segundo ejemplo:
className={clsx(classes.appBar, {[classes.appBarShift]: open })}Esto aplicará 'classes.appBar'. Pero, ¿cuál es el significado del segundo parámetro?
clsx generalmente se usa para aplicar condicionalmente un className dado
Esta sintaxis significa que alguna clase solo se aplicará si una condición dada se evalúa como true
const menuStyle = clsx({ [classes.root] : true, //always applies [classes.menuOpen] : open //only when open === true }) En este ejemplo [classes.menuOpen] (que se evaluará como algo como randomclassName123 ) solo se aplicará si está open === true
clsx básicamente genera una interpolación de string . Así que no tienes que usarlo necesariamente, aunque es una práctica común.
Hay muchas sintaxis admitidas que puede consultar en los documentos oficiales
En vez de
<div className={`${classes.foo} ${classes.bar} ${classes.baz}`} />Puedes usarlo así
const { foo, bar, baz } = classes const style = clsx(foo, bar, baz) return <div className={style} />Mucha gente ya lo ha explicado bastante bien. Todavía quería agregar un ejemplo que contenga className. En el ejemplo, puede ver diferentes clases, aplicadas si una condición dada se evalúa como verdadera. En el ejemplo, puede aplicar una clase con un valor booleano, una variable booleana o una cadena comparada (si coincide, devuelve verdadero). La clase classes.drawer siempre se aplica y no depende de una condición.
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 })}classes.appBarShift se aplicará solo si open se evalúa como true . Si la matriz tiene más clases, todas se aplicarán si open se evalúa como true