Eu sou novo no ReactJS e JSX e estou tendo um pequeno problema com o código abaixo.
Estou tentando adicionar várias classes ao className
atributo em cada um li
:
<li key={index} className={activeClass, data.class, "main-class"}></li>
Meu componente React é:
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
Hector
fonte
fonte
classNames={{foo: true, bar: true, baz: false}}
eclassNames={["foo", "bar"]}
apenas trabalha ?Respostas:
Uso nomes de classe quando há uma quantidade razoável de lógica necessária para decidir (não) o uso das classes. Um exemplo excessivamente simples :
Dito isto, se você não deseja incluir uma dependência, há respostas melhores abaixo.
fonte
import classNames from 'classnames'
ser usado em um 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>;
Eu uso
ES6
literais de modelo . Por exemplo:E então apenas renderize:
Versão de uma linha:
fonte
<input className={`class1 ${class2}`}>
<input class=" form-control input-lg round-lg" />
. Anote o espaço extra no começo. Isso é válido, mas feio. As perguntas frequentes sobre ReactBasta usar o JavaScript.
Se você deseja adicionar chaves e valores baseados em classes em um objeto, pode usar o seguinte:
Ou ainda mais simples:
fonte
className={['terra-Table', medOrder.resource.status]}
className={[listOfClasses].join(' ')}
lo está funcionando para mim obrigado!Concat
Não precisa ser extravagante, estou usando módulos CSS e é fácil
Isso resultará em:
Em outras palavras, ambos os estilos
Condicionais
Seria fácil usar a mesma idéia com if's
fonte
className={
controle deslizante $ {className? `$ {className}: ''}
}` `. Mas é muito. [nota: 'algo' + indefinido = 'algo sublinhado'. Js conversão dinâmica.Isso pode ser alcançado com os literais do modelo ES6:
fonte
<input className={`${class1} ${class2}`}>
Você pode criar um elemento com vários nomes de classe como este:
Naturalmente, você pode usar uma sequência contendo os nomes das classes e manipulá-las para atualizar os nomes das classes do elemento.
fonte
"
vez de'
. Me desculpe por isso.É assim que você pode fazer isso com o ES6:
Você pode listar várias classes e condições e também pode incluir classes estáticas. Não é necessário adicionar uma biblioteca adicional.
Boa sorte ;)
fonte
JS de baunilha
Não há necessidade de bibliotecas externas - basta usar as strings de modelo ES6 :
fonte
Talvez os nomes de classe possam ajudá-lo.
fonte
Eu não acho que precisamos usar um pacote externo apenas para adicionar várias classes.
Eu pessoalmente uso
ou
o segundo caso você precise adicionar ou remover classes condicionalmente.
fonte
Apenas adicionando, podemos filtrar as strings vazias.
fonte
Você pode criar um elemento com vários nomes de classe como este, tentei isso nos dois sentidos, está funcionando bem ...
Se você estiver importando algum css, poderá seguir este caminho: Caminho 1:
caminho 2:
**
Se você estiver aplicando css como interno:
fonte
Você pode fazer o seguinte:
Uma solução curta e simples, espero que ajude.
fonte
Isso pode ser feito com https://www.npmjs.com/package/clsx :
https://www.npmjs.com/package/clsx
Primeiro instale-o:
Em seguida, importe-o no seu arquivo de componente:
Em seguida, use a função importada no seu componente:
fonte
Tarde para a festa, mas por que usar terceiros para um problema tão simples?
Você poderia fazê-lo como @Huw Davies mencionou - a melhor maneira
Ambos são bons. Mas a escrita pode se tornar complexa para um aplicativo grande. Para torná-lo ideal, eu faço o mesmo acima, mas coloco em uma classe auxiliar
Usar minha função auxiliar abaixo, permite manter a lógica separada para edição futura e também oferece várias maneiras de adicionar as classes
ou
Esta é a minha função auxiliar abaixo. Coloquei-o em um helper.js, onde mantenho todos os meus métodos comuns. Sendo uma função tão simples, evitei usar terceiros para manter o controle
fonte
Você pode usar matrizes e juntá-las usando espaço.
Isso resultará em:
fonte
Sei que esta é uma resposta tardia, mas espero que isso ajude alguém.
Considere que você definiu as seguintes classes em um arquivo css ' primário ', ' font-i ', ' font-xl '
faria o truque!
Para mais informações: https://www.youtube.com/watch?v=j5P9FHiBVNo&list=PLC3y8-rFHvwgg3vaYJgHGnModB54rxOk3&index=20
fonte
para mais aulas adicionando
fonte
Usando o exemplo TodoTextInput.js do facebook
a substituição de nomes de classe por código simples vanilla js terá a seguinte aparência:
fonte
Se você não deseja importar outro módulo, esta função funciona como o
classNames
módulo.Você pode usá-lo assim:
fonte
function classNames(rules) { return Object.entries(rules) .reduce( (arr, [cls, flag]) => { if (flag) arr.push(cls); return arr }, [] ).join(" ") }
Isto é o que eu faço:
Componente:
Componente de chamada:
fonte
Estou usando o React 16.6.3 e o @Material UI 3.5.1 e posso usar matrizes em className como
className={[classes.tableCell, classes.capitalize]}
Portanto, no seu exemplo, o seguinte seria semelhante.
fonte
Use https://www.npmjs.com/package/classnames
importar classNames de 'classnames';
Pode usar várias classes usando comas separados:
Pode usar várias classes usando vírgulas separadas com a condição:
Usar array como adereços para classNames também funcionará, mas fornece aviso, por exemplo
fonte
Eu uso o pacote rc-classnames .
Você pode adicionar classes em qualquer formato (matriz, objeto, argumento). Todos os valores reais de matrizes ou argumentos e chaves em objetos iguais a
true
serem mesclados.por exemplo:
fonte
I
bind
classNames
para o módulo css importado para o componente.classnames
dá a capacidade de declararclassName
um elemento React de maneira declarativa.ex:
fonte
Eu costumo usá-lo assim: (no seu caso)
Quando se trata de JSX e (geralmente), temos alguns json ... do que você loop-lo ... componente . map , mais algumas condicionais para verificar se a propriedade json existe para renderizar o nome da classe, dependendo do valor da propriedade de JSON. No exemplo abaixo component_color e component_dark_shade são propriedades de component.map ()
Saída:
<div class="component no-color light" ....
Ou:<div class="component blue dark" ....
dependendo dos valores do mapa ...fonte
Quando tenho muitas classes diferentes, considero útil o seguinte.
O filtro remove qualquer um dos
null
valores e a união coloca todos os valores restantes em uma sequência separada por espaço.fonte