Hoje comecei a aprender ReactJS e depois de uma hora enfrentei o problema .. Quero inserir um componente que tem duas linhas dentro de uma div na página. Um exemplo simplificado do que estou fazendo abaixo.
Eu tenho um html:
<html>
..
<div id="component-placeholder"></div>
..
</html>
Renderizar a função como esta:
...
render: function() {
return(
<div className="DeadSimpleComponent">
<div className="DeadSimpleComponent__time">10:23:12</div >
<div className="DeadSimpleComponent__date">MONDAY, 2 MARCH 2015</div>
</div>
)
}
....
E abaixo estou chamando render:
ReactDOM.render(<DeadSimpleComponent/>, document.getElementById('component-placeholder'));
O HTML gerado tem a seguinte aparência:
<html>
..
<div id="component-placeholder">
<div class="DeadSimpleComponent">
<div class="DeadSimpleComponent__time">10:23:12</div>
<div class="DeadSimpleComponent__date">MONDAY, 2 MARCH 2015</div>
</div>
</div>
..
</html>
O problema que não estou muito feliz é que o React me forçou a embrulhar tudo em um div "DeadSimpleComponent". Qual é a melhor e mais simples solução alternativa para isso, sem manipulações explícitas de DOM?
ATUALIZAÇÃO 28/07/2017: Mantenedores do React adicionaram essa possibilidade no React 16 Beta 1
Desde React 16.2 , você pode fazer isso:
render() {
return (
<>
<ChildA />
<ChildB />
<ChildC />
</>
);
}
javascript
reactjs
Kirill Reznikov
fonte
fonte
Respostas:
Este requisito foi removido na versão React (16.0)] 1 , então agora você pode evitar esse invólucro.
Você pode usar React.Fragment para renderizar uma lista de elementos sem criar um nó pai, exemplo oficial:
Mais aqui: Fragmentos
fonte
Atualização 05-12-2017: React v16.2.0 agora oferece suporte total à renderização de fragmentos com suporte aprimorado para retornar vários filhos de um método de renderização de componentes sem especificar chaves nos filhos:
Se você estiver usando uma versão do React anterior à v16.2.0, também é possível usar
<React.Fragment>...</React.Fragment>
:Original:
O React v16.0 apresentou o retorno de uma matriz de elementos no método de renderização sem envolvê-lo em um div: https://reactjs.org/blog/2017/09/26/react-v16.0.html
No momento, uma chave é necessária para cada elemento para evitar o aviso de chave, mas isso pode ser alterado em versões futuras:
fonte
Você pode usar:
Para obter mais detalhes, consulte esta documentação .
fonte
Use [], em vez de () para envolver todo o retorno.
fonte
Criei um componente para envolver os componentes filhos sem um DIV. É chamado de shadow wrapper: https://www.npmjs.com/package/react-shadow-wrapper
fonte
Isso ainda é necessário , MAS React agora certifique-se de criar elementos sem criar um elemento DOM adicional.
O empacotamento extra necessário (normalmente com um pai
div
) porque ocreateElement
método Reacts requer umtype
parâmetro que éeither a tag name string (such as 'div' or 'span'), a React component type (a class or a function)
. Mas isso foi antes de eles apresentarem o ReactFragment
.Consulte este NOVO api doc para createElement
aqui está o exemplo oficial, Refer React.Fragment .
fonte
Você não conseguirá se livrar desse
div
elemento. React.render () precisa retornar um nó DOM válido.fonte
Esta é uma maneira de renderizar componentes "transculentes":
fonte
Também há uma solução alternativa. O código de bloco abaixo gera fragmentos sem a necessidade de React.Fragment.
fonte
Sei que essa pergunta foi respondida, você pode usar React.Fragment, que não cria um nó, mas permite agrupar coisas como um div.
Além disso, se você quiser se divertir, pode implementar (e aprender muitas coisas) um modo React que remove os divs extras e para isso eu realmente quero compartilhar um ótimo vídeo sobre como você pode fazer isso na própria base do código react.
https://www.youtube.com/watch?v=aS41Y_eyNrU
Obviamente, isso não é algo que você faria na prática, mas é uma boa oportunidade de aprendizado.
fonte