Estou tentando configurar meu React.js
aplicativo para que ele seja renderizado apenas se uma variável que eu definir for true
.
A maneira como minha função de renderização é configurada se parece com:
render: function() {
var text = this.state.submitted ? 'Thank you! Expect a follow up at '+email+' soon!' : 'Enter your email to request early access:';
var style = this.state.submitted ? {"backgroundColor": "rgba(26, 188, 156, 0.4)"} : {};
return (
<div>
if(this.state.submitted==false)
{
<input type="email" className="input_field" onChange={this._updateInputValue} ref="email" value={this.state.email} />
<ReactCSSTransitionGroup transitionName="example" transitionAppear={true}>
<div className="button-row">
<a href="#" className="button" onClick={this.saveAndContinue}>Request Invite</a>
</div>
</ReactCSSTransitionGroup>
}
</div>
)
},
Basicamente, a parte importante aqui é a if(this.state.submitted==false)
parte (eu quero essasdiv
elementos apareçam quando a variável enviada estiver configurada como false
).
Mas ao executar isso, recebo o erro na pergunta:
Erro não capturado: Erro de análise: Linha 38: Os elementos JSX adjacentes devem ser agrupados em uma tag anexa
Qual é o problema aqui? E o que posso usar para fazer isso funcionar?
javascript
reactjs
render
user1072337
fonte
fonte
Respostas:
Você deve colocar seu componente entre uma tag anexa, o que significa:
Em vez de:
Edit: Por comentário de Joe Clay sobre a API Fragments
fonte
É tarde para responder a essa pergunta, mas pensei que isso aumentaria a explicação.
Isso está acontecendo porque em qualquer lugar do seu código você está retornando dois elementos simultaneamente.
por exemplo
Deve ser envolto em um elemento pai . por exemplo
Explicação mais detalhada
Seu
jsx
código abaixo é transformadonisso
Mas se você fizer isso
isso é convertido nisso (apenas para fins ilustrativos, você receberá
error : Adjacent JSX elements must be wrapped in an enclosing tag
)No código acima, você pode ver que está tentando retornar duas vezes de uma chamada de método, o que está obviamente errado.
Editar- Últimas alterações no React 16 e nas próprias enfermarias:
Se você não deseja adicionar div extra para contornar e deseja devolver mais de um componente filho, pode usar
React.Fragments
.React.Fragments
são um pouco mais rápidos e têm menos uso de memória (não é necessário criar um nó DOM extra, uma árvore DOM menos confusa).por exemplo (no React 16.2.0)
ou
ou
fonte
O elemento reagir deve retornar apenas um elemento. Você precisará agrupar as duas tags com outra tag de elemento.
Também posso ver que sua função de renderização não está retornando nada. É assim que seu componente deve ficar:
Observe também que você não pode usar
if
instruções dentro de um elemento retornado:fonte
Se você não deseja agrupá-lo em outra div, como sugeriram outras respostas, também pode agrupá-lo em uma matriz e ele funcionará.
Pode ser escrito como:
Observe que o acima irá gerar um aviso:
Warning: Each child in an array or iterator should have a unique "key" prop. Check the render method of 'YourComponent'.
Isso pode ser corrigido adicionando um
key
atributo aos componentes, se adicionar manualmente, adicione-o como:Aqui estão mais algumas informações sobre as chaves: Composição x Herança
fonte
O problema
Isso significa que você está tentando retornar vários elementos JSX irmãos de maneira incorreta. Lembre-se de que você não está escrevendo HTML, mas JSX! Seu código é transpilado do JSX para o JavaScript. Por exemplo:
será transpilado para:
A menos que você seja iniciante em programação em geral, você já sabe que funções / métodos (de qualquer idioma) usam qualquer número de parâmetros, mas sempre retornam apenas um valor. Dado isso, você provavelmente pode ver que surge um problema ao tentar retornar vários componentes irmãos com base em como
createElement()
funciona; leva apenas parâmetros para um elemento e retorna isso. Portanto, não podemos retornar vários elementos de uma chamada de função.Então, se você já se perguntou por que isso funciona ...
mas não isso ...
é porque no primeiro trecho, ambos
<p>
-elements fazem partechildren
do<div>
-element. Quando eles fazem partechildren
, podemos expressar um número ilimitado de elementos irmãos. Veja como isso se traduziria:Soluções
Dependendo da versão do React que você está executando, você tem algumas opções para resolver isso:
Use fragmentos (somente no React v16.2 +!)
A partir do React v16.2, o React tem suporte para Fragments, que é um componente sem nós que retorna seus filhos diretamente.
O retorno dos filhos em uma matriz (veja abaixo) tem algumas desvantagens:
Estes são eliminados do uso de fragmentos. Aqui está um exemplo de crianças envolvidas em um fragmento:
que desengordura em:
Observe que o primeiro trecho requer o Babel v7.0 ou superior.
Retornar uma matriz (somente React v16.0 +!)
A partir do React v16, o React Components pode retornar matrizes. Isso é diferente das versões anteriores do React, nas quais você era forçado a agrupar todos os componentes irmãos em um componente pai.
Em outras palavras, agora você pode fazer:
isso transpila para:
Observe que o acima mencionado retorna uma matriz. As matrizes são elementos do React válidos desde o React versão 16 e posterior. Para versões anteriores do React, matrizes não são objetos de retorno válidos!
Observe também que o seguinte é inválido (você deve retornar uma matriz):
Quebrar os elementos em um elemento pai
A outra solução envolve a criação de um componente pai que envolve os componentes irmãos
children
. Essa é de longe a maneira mais comum de resolver esse problema e funciona em todas as versões do React.Nota: Dê uma olhada novamente na parte superior desta resposta para obter mais detalhes e como isso se traduz .
fonte
v16.4
o primeiro exemplo não funciona usando<>
<React.Fragment>
Na reação 16.0.0 , podemos retornar vários componentes da renderização como uma matriz.
Na reação 16.4.0 , podemos retornar vários componentes da renderização em uma tag Fragment. Fragmento
Reação futura, você poderá usar esta sintaxe abreviada. (muitas ferramentas ainda não a suportam, portanto, você pode escrever explicitamente
<Fragment>
até que as ferramentas sejam atualizadas.)fonte
,
entre os componentes. É uma matriz, então você precisa separar cada elemento dentro dela.<Fragment>
, é<React.Fragment>
. diz isso em seu próprio linkimport React { Fragment } from 'react';
então você usá-lo como este<Fragment >
Se você não quebrar o seu componente, poderá escrevê-lo como mencionado abaixo no método.
Ao invés de:
você pode escrever isto:
fonte
é muito simples, podemos usar um elemento pai div para agrupar todo o elemento ou podemos usar o conceito de componente de ordem superior (HOC), ou seja, muito útil para aplicações js react
ou outra melhor maneira é HOC, é muito simples, não muito complicado, basta adicionar um arquivo hoc.js ao seu projeto e simplesmente adicionar esses códigos
agora importe o arquivo hoc.js para o qual deseja usar; agora, em vez de agrupar com o elemento div, podemos agrupar com hoc.
fonte
Há uma regra no react que uma expressão JSX deve ter exatamente um elemento mais externo.
errado
corrigir
fonte
O React 16 obtém seu retorno como uma matriz, portanto deve ser envolvido por um elemento como div.
Abordagem errada
Abordagem correta (todos os elementos em uma div ou outro elemento que você está usando)
fonte
Os componentes de reação devem ser empacotados em um único contêiner, que pode ser qualquer tag, por exemplo, "<div> .. </ div>"
Você pode verificar o método de renderização de ReactCSSTransitionGroup
fonte
Importe a visualização e envolva
View
. Envolvendo umdiv
não funcionou para mim.fonte
View
não é realmente a melhor solução.Inválido: não apenas elementos filho
Válido: elemento raiz em elementos filho
fonte
Para desenvolvedores Rect-Native. Eu encontrei esse erro ao renderizarItem no FlatList. Eu tinha dois componentes de texto. Eu estava usando-os como abaixo
Mas depois que eu coloquei esses componentes no Inside View, funcionou para mim.
Você pode estar usando outros componentes, mas colocá-los no modo de exibição pode ser útil para você.
fonte
View
não é realmente a melhor solução.Acho que a complicação também pode ocorrer ao tentar aninhar vários Divs na declaração de retorno. Você pode fazer isso para garantir que seus componentes sejam renderizados como elementos de bloco.
Aqui está um exemplo de renderização correta de alguns componentes, usando várias divs.
fonte
Eu tive um problema que gerou esse erro que nem todos eram óbvios.
E aqui estava a solução ...
Vai saber. Informações compartilhadas aqui caso outras pessoas cheguem a esse problema. Aparentemente, você não pode ter um nome de classe de elemento igual ao nome da função pai de React.
fonte