Quero mostrar e ocultar condicionalmente esse grupo de botões, dependendo do que é passado do componente pai, que se parece com isso:
<TopicNav showBulkActions={this.__hasMultipleSelected} />
....
__hasMultipleSelected: function() {
return false; //return true or false depending on data
}
....
var TopicNav = React.createClass({
render: function() {
return (
<div className="row">
<div className="col-lg-6">
<div className="btn-group pull-right {this.props.showBulkActions ? 'show' : 'hidden'}">
<button type="button" className="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
Bulk Actions <span className="caret"></span>
</button>
<ul className="dropdown-menu" role="menu">
<li><a href="#">Merge into New Session</a></li>
<li><a href="#">Add to Existing Session</a></li>
<li className="divider"></li>
<li><a href="#">Delete</a></li>
</ul>
</div>
</div>
</div>
);
}
});
Porém, nada está acontecendo com as {this.props.showBulkActions? 'show': 'oculto'}. Estou fazendo algo errado aqui?
javascript
css
twitter-bootstrap-3
reactjs
class-attributes
apexdodge
fonte
fonte
Respostas:
Os chavetas estão dentro da string, portanto estão sendo avaliadas como string. Eles precisam estar fora, então isso deve funcionar:
Observe o espaço após "pull-right". Você não deseja fornecer acidentalmente a classe "pull-rightshow" em vez de "pull-right show". Também os parênteses precisam estar lá.
fonte
classnames
pode não ser apropriado. Se você estiver em suarender
função e tiver ummap
, talvez só saiba se deseja adicionar uma classe no momento em que a estiver renderizando, portanto essa resposta é bastante útil para isso.this.props.showBulkActions ? 'btn-group pull-right show' : 'btn-group pull-right hidden')
. Não é elegante, mas funciona.Como outros comentaram, o utilitário classnames é a abordagem atualmente recomendada para lidar com nomes condicionais de classes CSS nos ReactJs.
No seu caso, a solução será semelhante a:
...
Como uma observação lateral, sugiro que você tente evitar o uso de ambos
show
ehidden
classes, para que o código seja mais simples. Provavelmente você não precisa definir uma classe para que algo seja mostrado por padrão.fonte
classNames
no momento?Se você estiver usando um transpiler (como Babel ou Traceur), poderá usar as novas " strings de modelo " do ES6 .
Aqui está a resposta de @ spitfire109, modificada de acordo:
Essa abordagem permite que você faça coisas legais como essa, renderizando
s-is-shown
ous-is-hidden
:fonte
s-is-shown
ous-is-hidden
na base de código, não encontrará esse código.Você pode usar aqui literais String
fonte
Gastando com a boa resposta de @ spitfire109, pode-se fazer algo assim:
e depois dentro da função de renderização:
mantém o jsx curto
fonte
Ou use nomes de classe npm . É muito fácil e útil, especialmente para construir a lista de classes
fonte
Caso você precise apenas de um nome de classe opcional:
fonte
false
classe quando a condição falhar.Você pode usar matrizes ES6 em vez de nomes de classe. A resposta é baseada no artigo do Dr. Axel Rauschmayer: Adicionando condicionalmente entradas dentro de matrizes e literais de objetos .
fonte
2019:
React é um lago de muitos utilitários. Mas você não precisa de nenhum
npm
pacote para isso. basta criar em algum lugar a funçãoclassnames
e chamá-la quando precisar;ou
exemplo
Just For Inspiration
declarar elemento auxiliar e usou o
toggle
método(DOMTokenList)classList.toggle(class,condition)
exemplo:
fonte
Solução mais elegante, melhor para manutenção e legibilidade:
fonte
você pode usar isso:
fonte
Isso funcionaria para você
fonte
Você pode usar este pacote npm. Ele lida com tudo e tem opções para classes estáticas e dinâmicas com base em uma variável ou uma função.
fonte
Com base no valor de
this.props.showBulkActions
você pode alternar classes dinamicamente da seguinte maneira.fonte
Gostaria de acrescentar que você também pode usar um conteúdo variável como parte da classe
O contexto é um bate-papo entre um bot e um usuário, e os estilos mudam dependendo do remetente, este é o resultado do navegador:
fonte
Isso é útil quando você tem mais de uma classe a acrescentar. Você pode ingressar em todas as classes na matriz com um espaço.
fonte
Substituir:
com:
fonte
Referência à resposta do @split fire, podemos atualizá-la com literais do modelo, que são mais legíveis. Para referência literal do modelo javascript do Google Checkout
fonte
Achei isso que explica como fazê-lo com uma biblioteca ternária e com Classnames
fonte