Uma linha funciona bem
render: function () {
return (
{[1,2,3].map(function (n) {
return <p>{n}</p>
}}
);
}
não para várias linhas
render: function () {
return (
{[1,2,3].map(function (n) {
return (
<h3>Item {n}</h3>
<p>Description {n}</p>
)
}}
);
}
Obrigado.
return ("asdf" "asdf");
você não querreturn ["asdf", "asdf"];
Respostas:
Tente pensar nas tags como chamadas de função (consulte a documentação ). Então o primeiro se torna:
E o segundo:
Agora deve estar claro que o segundo snippet realmente não faz sentido (você não pode retornar mais de um valor em JS). Você deve envolvê-lo em outro elemento (provavelmente o que você deseja, dessa forma, você também pode fornecer uma
key
propriedade válida ) ou pode usar algo assim:Com açúcar JSX:
Você não precisa nivelar o array resultante, o React fará isso para você. Veja o seguinte violino http://jsfiddle.net/mEB2V/1/ . Novamente: agrupar os dois elementos em uma div / seção provavelmente será melhor a longo prazo.
fonte
Uncaught Error: Invariant Violation: Product.render(): A valid ReactComponent must be returned. You may have returned undefined, an array or some other invalid object.
<div>{ this.props.foos.map(function() { return <Foo /> }) }</div>
. Mas arender
função do componente não pode retornar esse array sem envolvê-lo, por exemplo, em um div.Parece que a velha resposta sobre retornar um array não se aplica mais (talvez desde React ~ 0.9, como @ dogmatic69 escreveu em um comentário ).
Os documentos dizem que você precisa retornar um único nó:
Em muitos casos, você pode simplesmente embrulhar as coisas em um
<div>
ou a<span>
.No meu caso, eu queria retornar vários
<tr>
s. Eu os embrulhei em uma<tbody>
- uma mesa pode ter vários corpos.EDITAR: a partir do React 16.0, retornar uma matriz aparentemente é permitido novamente, desde que cada elemento tenha um
key
: https://facebook.github.io/react/blog/2017/09/26/react-v16.0.html # new-render-return-types-fragments-and-stringsEDIT: React 16.2 permite cercar uma lista de elementos com
<Fragment>…</Fragment>
ou mesmo<>…</>
, se você preferir isso a um array: https://blog.jmes.tech/react-fragment-and-semantic-html/fonte
<li>
? Supondo que eu não possa simplesmente encerrar tudo<ul>
<li><ul><li>one</li><li>two</li></ul></li>
se isso funcionar na sua situação. Ou: Uma div envolvente não seria estritamente válida, mas talvez funcione bem em todos os navegadores relevantes? Se você tentar, avise-nos.li
em umspan
oudiv
não funcionou bem para mim. O div quebrou seriamente a renderização e, pelo menos no meu caso de uso, o span bagunçou o CSS. 2 ¢: Tentar retornar vários subconjuntos deli
s é um cheiro de código. Estávamos usando umul
como uma espécie de menu suspenso, e inicialmente queria que muitos componentes retornassem "seções" deli
s. No final, era melhor colocar todo o código do menu em um único componente "ancorado" emul
do que instalarli
s de fontes múltiplas. Acho que também deixou o modelo mental da IU um pouco mais limpo.Do React v16.0.0 em diante, é possível retornar vários elementos envolvendo-os dentro de um
Array
Também a partir do React v16.2.0 , um novo recurso chamado
React Fragments
é introduzido, que você pode usar para envolver vários elementosConforme a documentação:
fonte
Além disso, você pode querer retornar vários itens de lista em alguma função auxiliar dentro de um componente React. Basta retornar uma matriz de nós html com o
key
atributo:fonte
Você pode usar
createFragment
aqui.https://facebook.github.io/react/docs/create-fragment.html
(usando ES6 e sintaxe JSX aqui)
primeiro você precisa adicionar o
react-addons-create-fragment
pacote:Vantagem sobre a solução de Jan Olaf Krems: reagir não reclamar dos desaparecidos
key
fonte
Atualizada
Use React Fragment. É simples. Link para a documentação do fragmento.
Resposta antiga - obsoleta
Com React> 16, você pode usar o composto de reação .
Obviamente, o composto reactivo deve ser instalado.
fonte
É simples por fragmento React
<></>
eReact.Fragment
:fonte