Como opcionalmente incluo um elemento no JSX? Aqui está um exemplo usando um banner que deve estar no componente se ele foi passado. O que eu quero evitar é ter que duplicar as tags HTML na instrução if.
render: function () {
var banner;
if (this.state.banner) {
banner = <div id="banner">{this.state.banner}</div>;
} else {
banner = ?????
}
return (
<div id="page">
{banner}
<div id="other-content">
blah blah blah...
</div>
</div>
);
}
javascript
reactjs
react-jsx
Jack Allan
fonte
fonte
else
filial, isso funciona? Eu não estou familiarizado com JSX ...Respostas:
Apenas deixe o banner como indefinido e ele não será incluído.
fonte
null
tão bem quantoundefined
? Também é parte da especificação que funciona dessa maneira e, portanto, provavelmente não será interrompida no futuro?Que tal isso? Vamos definir um
If
componente de ajuda simples .E use-o desta maneira:
ATUALIZAÇÃO: Como minha resposta está ficando popular, sinto-me obrigado a avisá-lo sobre o maior perigo relacionado a esta solução. Conforme apontado em outra resposta, o código dentro do
<If />
componente é executado sempre, independentemente de a condição ser verdadeira ou falsa. Portanto, o exemplo a seguir falhará no caso debanner
isnull
(observe o acesso à propriedade na segunda linha):Você precisa ter cuidado ao usá-lo. Sugiro a leitura de outras respostas para abordagens alternativas (mais seguras).
ATUALIZAÇÃO 2: Olhando para trás, essa abordagem não é apenas perigosa, mas também desesperadamente complicada. É um exemplo típico de quando um desenvolvedor (eu) tenta transferir padrões e abordagens que conhece de uma área para outra, mas na verdade não funciona (nesse caso, outras linguagens de modelos).
Se você precisar de um elemento condicional, faça o seguinte:
Se você também precisar da ramificação else, basta usar um operador ternário:
É muito mais curto, mais elegante e seguro. Eu uso isso o tempo todo. A única desvantagem é que você não pode fazer
else if
ramificações tão facilmente, mas isso geralmente não é tão comum.De qualquer forma, isso é possível graças ao funcionamento dos operadores lógicos no JavaScript. Os operadores lógicos até permitem pequenos truques como este:
fonte
ReactElement
<span>
ou<div>
.Pessoalmente, acho que as expressões ternárias mostradas em ( JSX In Depth ) são a maneira mais natural que está de acordo com os padrões do ReactJs.
Veja o exemplo a seguir. É um pouco confuso à primeira vista, mas funciona muito bem.
fonte
Você também pode escrever como
Se você
state.banner
énull
ouundefined
, o lado direito da condição é ignorado.fonte
O
If
componente de estilo é perigoso porque o bloco de código é sempre executado independentemente da condição. Por exemplo, isso causaria uma exceção nula sebanner
énull
:Outra opção é usar uma função embutida (especialmente útil com instruções else):
Outra opção dos problemas de reação :
fonte
&& + estilo de código + componentes pequenos
Esta sintaxe de teste simples + convenção no estilo de código + pequenos componentes focados é para mim a opção mais legível disponível no mercado. Você só precisa ter um cuidado especial com valores falsos como
false
,0
ou""
.faça notação
A sintaxe da notação ES7 estágio 0 também é muito boa e eu definitivamente a utilizarei quando meu IDE oferecer suporte corretamente:
Mais detalhes aqui: ReactJs - Criando um componente "If" ... uma boa idéia?
fonte
short-circuit syntax
Simples, crie uma função.
Esse é um padrão que eu pessoalmente sigo o tempo todo. Torna o código realmente limpo e fácil de entender. Além disso, permite refatorar
Banner
em seu próprio componente se ele for muito grande (ou reutilizado em outros lugares).fonte
A
do
sintaxe experimental do ES7 facilita isso. Se você estiver usando o Babel, ative oes7.doExpressions
recurso:Veja http://wiki.ecmascript.org/doku.php?id=strawman:do_expressions
fonte
Como já mencionado nas respostas, o JSX apresenta duas opções
Operador ternário
{ this.state.price ? <div>{this.state.price}</div> : null }
Conjunção lógica
{ this.state.price && <div>{this.state.price}</div> }
No entanto, esses não funcionam
price == 0
.O JSX renderizará a ramificação falsa no primeiro caso e, no caso de conjunção lógica, nada será renderizado. Se a propriedade puder ser 0, use apenas instruções if fora do seu JSX.
fonte
typeof(this.state.price) === "number"
como condição (em qualquer uma das variantes).Este componente funciona quando você tem mais de um elemento dentro da ramificação "if":
Uso:
Ps alguém pensa que esses componentes não são bons para a leitura de código. Mas, na minha opinião, Html com javascript é pior
fonte
A maioria dos exemplos está com uma linha de "html" que é renderizada condicionalmente. Isso me parece legível quando tenho várias linhas que precisam ser renderizadas condicionalmente.
O primeiro exemplo é bom porque, em vez de
null
, podemos renderizar condicionalmente algum outro conteúdo, como{this.props.showContent ? content : otherContent}
Mas se você só precisa mostrar / ocultar conteúdo, isso é ainda melhor, pois Booleanos, Nulos e Indefinidos São Ignorados
fonte
Existe outra solução, se o componente React :
fonte
Eu uso um atalho mais explícito: Uma expressão de função chamada imediatamente (IIFE):
fonte
Criei https://www.npmjs.com/package/jsx-control-statements para facilitar um pouco, basicamente permite definir
<If>
condicionais como tags e depois compila-os em ifs ternários para que o código dentro do<If>
único seja executado se a condição for verdadeira.fonte
Também há uma versão realmente limpa de uma linha ... {this.props.product.title || "Sem título"}
Ou seja:
fonte
Recentemente, fiz https://github.com/ajwhite/render-if para renderizar elementos com segurança somente se o predicado for aprovado .
ou
fonte
Você pode incluir condicionalmente elementos usando o operador ternário da seguinte forma:
fonte
Você pode usar uma função e retornar o componente e manter fina a função de renderização
fonte
Aqui está minha abordagem usando o ES6.
Demonstração: http://jsfiddle.net/kb3gN/16688/
Estou usando código como:
Isso renderizará
SomeElement
apenas seopened
for verdadeiro. Funciona devido à maneira como o JavaScript resolve as condições lógicas:Como
React
será ignoradofalse
, acho uma maneira muito boa de renderizar condicionalmente alguns elementos.fonte
Talvez ajude alguém que se depara com a pergunta: Todas as renderizações condicionais em React É um artigo sobre todas as diferentes opções de renderização condicional no React.
Principais informações sobre quando usar qual renderização condicional:
** se-mais
** operador ternário
** operador lógico e&
** caixa do interruptor
** enumerações
** renderizações condicionais de vários níveis / aninhadas
** HOCs
** componentes externos de modelos
fonte
Com o ES6, você pode fazer isso com uma única linha
"show" é um booleano e você usa essa classe
fonte
Eu não acho que isso tenha sido mencionado. É como sua própria resposta, mas acho que é ainda mais simples. Você sempre pode retornar cadeias de caracteres das expressões e pode aninhar jsx dentro de expressões, portanto, isso permite uma expressão embutida fácil de ler.
fonte
Eu gosto da explicitação de Expressões de Função Imediatamente Invocadas (
IIFE
) eif-else
maisrender callbacks
e maisternary operators
.Você só precisa se familiarizar com a
IIFE
sintaxe,{expression}
é a sintaxe usual do React, por dentro, basta considerar que você está escrevendo uma função que está se chamando.que precisam ser embrulhados em parênteses
fonte
Há também uma técnica que usa objetos de renderização para renderizar condicionalmente um componente. Seu benefício é que a renderização não será avaliada até que a condição seja atendida, resultando em nenhuma preocupação com valores nulos e indefinidos .
fonte
Quando precisar renderizar algo apenas se a condição aprovada for preenchida, você poderá usar a sintaxe:
O código dessa maneira ficaria assim:
É claro que existem outras maneiras válidas de fazer isso, tudo depende das preferências e da ocasião. Você pode aprender mais maneiras de como renderizar condicional em React neste artigo, se estiver interessado!
fonte
Apenas para adicionar outra opção - se você gosta / tolera coffee-script, pode usar coffee-react para escrever seu JSX; nesse caso, as instruções if / else são utilizáveis, pois são expressões em coffee-script e não:
fonte
Apenas para estender a resposta de @Jack Allan com referências a documentos.
A documentação básica (Quick Start) de reação é sugerida
null
nesse caso. No entanto, booleanos, nulo e indefinido também são ignorados , mencionados no guia Avançado.fonte