Necesito agregar una clase dinámica a una lista de clases regulares, pero no tengo idea de cómo (estoy usando babel), algo como esto:
<div className="wrapper searchDiv {this.state.something}">
...
</div>
¿Algunas ideas?
Necesito agregar una clase dinámica a una lista de clases regulares, pero no tengo idea de cómo (estoy usando babel), algo como esto:
<div className="wrapper searchDiv {this.state.something}">
...
</div>
¿Algunas ideas?
Respuestas:
Puedes hacer esto, JavaScript normal:
className={'wrapper searchDiv ' + this.state.something}
o la versión de la plantilla de cadena, con backticks:
className={`wrapper searchDiv ${this.state.something}`}
Por supuesto, ambos tipos son solo JavaScript, pero el primer patrón es el tradicional.
De todos modos, en JSX, cualquier cosa entre corchetes se ejecuta como JavaScript, por lo que básicamente puede hacer lo que quiera allí. Pero la combinación de cadenas JSX y llaves no es una opción para los atributos.
element.classList.add("my-class")
; por lo tanto permitiendo:className={`wrapper searchDiv ${this.state.something ? "my-class " : ""} ${this.state.somethingElse ? "my-other-class " : ""}`}
className={'wrapper searchDiv} + this.state.isTrue ? 'my-class' : ' '
Esto no funciona ¿Alguien puede decir por qué?
Dependiendo de cuántas clases dinámicas necesite agregar a medida que su proyecto crezca, probablemente valga la pena consultar la utilidad de nombres de clase de JedWatson en GitHub. Le permite representar sus clases condicionales como un objeto y devuelve las que evalúan como verdaderas.
Entonces, como ejemplo de su documentación React:
render () {
var btnClass = classNames({
'btn': true,
'btn-pressed': this.state.isPressed,
'btn-over': !this.state.isPressed && this.state.isHovered
});
return <button className={btnClass}>I'm a button!</button>;
}
Dado que React activa una nueva representación cuando hay un cambio de estado, los nombres de clase dinámicos se manejan de forma natural y se mantienen actualizados con el estado de su componente.
Aquí está la mejor opción para Dynamic ClassName, solo haga una concatenación como lo hacemos en Javascript.
className={
"badge " +
(this.state.value ? "badge-primary " : "badge-danger ") +
" m-4"
}
Si necesita nombres de estilo que deberían aparecer de acuerdo con la condición de estado, prefiero usar esta construcción:
<div className={'wrapper searchDiv' + (this.state.something === "a" ? " anotherClass" : "")'}>
intente esto usando ganchos:
const [dynamicClasses, setDynamicClasses] = React.useState([
"dynamicClass1", "dynamicClass2
]);
y agregue esto en el atributo className:
<div className=`wrapper searchDiv ${[...dynamicClasses]}`>
...
</div>
para agregar clase:
const addClass = newClass => {
setDynamicClasses([...dynamicClasses, newClass])
}
para eliminar la clase:
const deleteClass= classToDelete => {
setDynamicClasses(dynamicClasses.filter(class = > {
class !== classToDelete
}));
}
Puede usar este paquete npm. Maneja todo y tiene opciones para clases estáticas y dinámicas basadas en una variable o una función.
// Support for string arguments
getClassNames('class1', 'class2');
// support for Object
getClassNames({class1: true, class2 : false});
// support for all type of data
getClassNames('class1', 'class2', ['class3', 'class4'], {
class5 : function() { return false; },
class6 : function() { return true; }
});
<div className={getClassNames({class1: true, class2 : false})} />
getBadgeClasses() {
let classes = "badge m-2 ";
classes += (this.state.count === 0) ? "badge-warning" : "badge-primary";
return classes;
}
<span className={this.getBadgeClasses()}>Total Count</span>
className={css(styles.mainDiv, 'subContainer')}
Esta solución se ha probado en React SPFx.
También agregue la declaración de importación:
import { css } from 'office-ui-fabric-react/lib/Utilities';