Soy nuevo en ReactJS y JSX y tengo un pequeño problema con el código a continuación.
Estoy tratando de agregar varias clases al className
atributo en cada una li
:
<li key={index} className={activeClass, data.class, "main-class"}></li>
Mi componente Reaccionar es:
var AccountMainMenu = React.createClass({
getInitialState: function() {
return { focused: 0 };
},
clicked: function(index) {
this.setState({ focused: index });
},
render: function() {
var self = this;
var accountMenuData = [
{
name: "My Account",
icon: "icon-account"
},
{
name: "Messages",
icon: "icon-message"
},
{
name: "Settings",
icon: "icon-settings"
}
/*{
name:"Help & Support <span class='font-awesome icon-support'></span>(888) 664.6261",
listClass:"no-mobile last help-support last"
}*/
];
return (
<div className="acc-header-wrapper clearfix">
<ul className="acc-btns-container">
{accountMenuData.map(function(data, index) {
var activeClass = "";
if (self.state.focused == index) {
activeClass = "active";
}
return (
<li
key={index}
className={activeClass}
onClick={self.clicked.bind(self, index)}
>
<a href="#" className={data.icon}>
{data.name}
</a>
</li>
);
})}
</ul>
</div>
);
}
});
ReactDOM.render(<AccountMainMenu />, document.getElementById("app-container"));
javascript
css
reactjs
ecmascript-6
Héctor
fuente
fuente
classNames={{foo: true, bar: true, baz: false}}
yclassNames={["foo", "bar"]}
solo trabajar ?Respuestas:
Uso los nombres de clase cuando hay una buena cantidad de lógica requerida para decidir las clases que (no) usarán. Un ejemplo demasiado simple :
Dicho esto, si no desea incluir una dependencia, hay mejores respuestas a continuación.
fuente
import classNames from 'classnames'
luego usarlo en un componenteclassName={classNames(classes.myFirstClass, classes.mySecondClass)}
.var btnClass = classNames({ btn: true, 'btn-pressed': this.state.isPressed, 'btn-over': !this.state.isPressed && this.state.isHovered }); return <button className={btnClass}>{this.props.label}</button>;
Yo uso
ES6
plantillas literales . Por ejemplo:Y luego solo renderízalo:
Versión de una línea:
fuente
<input className={`class1 ${class2}`}>
<input class=" form-control input-lg round-lg" />
. Tenga en cuenta el espacio extra al principio. Esto es válido, pero feo. Incluso reaccionar FAQ recomienda otra forma o usar el paquete de nombres deSolo usa JavaScript.
Si desea agregar claves y valores basados en clases en un objeto, puede usar lo siguiente:
O incluso más simple:
fuente
className={['terra-Table', medOrder.resource.status]}
className={[listOfClasses].join(' ')}
, está funcionando para mí, gracias!Concat
No es necesario ser elegante. Estoy usando módulos CSS y es fácil.
Esto resultará en:
En otras palabras, ambos estilos
Condicionales
Sería fácil usar la misma idea con if's
fuente
className={
control deslizante $ {className? `$ {className}: ''}
}` `. Pero es mucho [nota: 'something' + undefined = 'algo subfinado'. Js conversión dinámica.Esto se puede lograr con los literales de plantilla ES6:
fuente
<input className={`${class1} ${class2}`}>
Puede crear un elemento con varios nombres de clase como este:
Naturalmente, puede usar una cadena que contenga los nombres de clase y manipular esta cadena para actualizar los nombres de clase del elemento.
fuente
"
lugar de'
. Lo siento por eso.Así es como puedes hacer eso con ES6:
Puede enumerar múltiples clases y condiciones y también puede incluir clases estáticas. No es necesario agregar una biblioteca adicional.
Buena suerte ;)
fuente
Vanilla JS
No necesita bibliotecas externas: solo use cadenas de plantilla ES6 :
fuente
Tal vez los nombres de clase pueden ayudarte.
fuente
No creo que necesitemos usar un paquete externo para solo agregar varias clases.
Yo personalmente uso
o
el segundo en caso de que necesite agregar o eliminar clases condicionalmente.
fuente
Solo agregando, podemos filtrar cadenas vacías.
fuente
Puede crear un elemento con múltiples nombres de clase como este, lo intenté en ambos sentidos, funciona bien ...
Si importa cualquier CSS, puede seguir este camino: Modo 1:
camino 2:
** **
Si aplica css como interno:
fuente
Podrías hacer lo siguiente:
Una solución corta y simple, espero que esto ayude.
fuente
Se puede hacer con https://www.npmjs.com/package/clsx :
https://www.npmjs.com/package/clsx
Primero instálalo:
Luego impórtelo en su archivo componente:
Luego use la función importada en su componente:
fuente
Tarde a la fiesta, pero ¿por qué usar un tercero para un problema tan simple?
Podrías hacerlo como mencionó @Huw Davies: la mejor manera
Ambos son buenos. Pero escribir puede volverse complejo para una aplicación grande. Para hacerlo óptimo, hago lo mismo arriba pero lo pongo en una clase auxiliar
El uso de mi función de ayuda a continuación, me permite mantener la lógica separada para futuras ediciones, y también me brinda múltiples formas de agregar las clases
o
Esta es mi función de ayuda a continuación. Lo puse en un helper.js donde guardo todos mis métodos comunes. Al ser una función tan simple, evité usar un tercero para mantener el control
fuente
Puede usar matrices y luego unirlas usando el espacio.
Esto resultará en:
fuente
Sé que esta es una respuesta tardía, pero espero que esto ayude a alguien.
Tenga en cuenta que ha definido las siguientes clases en un archivo css ' primario ', ' font-i ', ' font-xl '
haría el truco!
Para más información: https://www.youtube.com/watch?v=j5P9FHiBVNo&list=PLC3y8-rFHvwgg3vaYJgHGnModB54rxOk3&index=20
fuente
para más clases agregando
fuente
Usando el ejemplo de Facebook TodoTextInput.js
Reemplazar los nombres de clase con código simple vanilla js se verá así:
fuente
Si no tiene ganas de importar otro módulo, esta función funciona como el
classNames
módulo.Puedes usarlo así:
fuente
function classNames(rules) { return Object.entries(rules) .reduce( (arr, [cls, flag]) => { if (flag) arr.push(cls); return arr }, [] ).join(" ") }
Eso es lo que hago:
Componente:
Componente de llamada:
fuente
Estoy usando React 16.6.3 y @Material UI 3.5.1, y puedo usar matrices en className como
className={[classes.tableCell, classes.capitalize]}
Entonces, en su ejemplo, lo siguiente sería similar.
fuente
Use https://www.npmjs.com/package/classnames
importar classNames desde 'nombres de clase';
Puede usar múltiples clases usando comas separadas:
Puede usar múltiples clases usando comas separadas con condición:
El uso de array como accesorios para classNames también funcionará, pero da una advertencia, por ejemplo
fuente
Yo uso el paquete rc-classnames .
Puede agregar clases en cualquier formato (matriz, objeto, argumento). Todos los valores verdaderos de matrices o argumentos más claves en objetos que equivalen a
true
fusionarse.por ejemplo:
fuente
I
bind
classNames
al módulo css importado al componente.classnames
da la capacidad de declararclassName
un elemento React de forma declarativa.ex:
fuente
Usualmente lo uso así: (en tu caso)
Cuando se trata de JSX y (por lo general) tenemos algo de json ... de lo que lo bucle ... componente . map , más algunos condicionales para verificar si la propiedad json existe para representar el nombre de la clase dependiendo del valor de la propiedad de JSON. En el siguiente ejemplo, component_color y component_dark_shade son propiedades de component.map ()
Salida:
<div class="component no-color light" ....
O:<div class="component blue dark" ....
dependiendo de los valores del mapa ...fuente
Cuando tengo muchas clases diferentes, he encontrado que lo siguiente es útil.
El filtro elimina cualquiera de los
null
valores y la unión coloca todos los valores restantes en una cadena separada por espacios.fuente