Aujourd'hui, j'ai commencé à apprendre ReactJS et après une heure confronté au problème .. Je veux insérer un composant qui a deux lignes à l'intérieur d'un div sur la page. Un exemple simplifié de ce que je fais ci-dessous.
J'ai un html:
<html>
..
<div id="component-placeholder"></div>
..
</html>
Fonction de rendu comme ceci:
...
render: function() {
return(
<div className="DeadSimpleComponent">
<div className="DeadSimpleComponent__time">10:23:12</div >
<div className="DeadSimpleComponent__date">MONDAY, 2 MARCH 2015</div>
</div>
)
}
....
Et ci-dessous, j'appelle render:
ReactDOM.render(<DeadSimpleComponent/>, document.getElementById('component-placeholder'));
Le HTML généré ressemble à ceci:
<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>
Le problème que je ne suis pas très content que React m'oblige à tout envelopper dans un div "DeadSimpleComponent". Quelle est la meilleure solution de contournement simple pour cela, sans manipulations DOM explicites?
MISE À JOUR 28/07/2017: Les responsables de React ont ajouté cette possibilité dans React 16 Beta 1
Depuis React 16.2 , vous pouvez faire ceci:
render() {
return (
<>
<ChildA />
<ChildB />
<ChildC />
</>
);
}
javascript
reactjs
Kirill Reznikov
la source
la source
Réponses:
Cette exigence a été supprimée dans la version React (16.0)] 1 , vous pouvez donc désormais éviter ce wrapper.
Vous pouvez utiliser React.Fragment pour afficher une liste d'éléments sans créer de nœud parent, exemple officiel:
Plus ici: Fragments
la source
Mise à jour 05/12/2017: React v16.2.0 prend désormais entièrement en charge le rendu des fragments avec une prise en charge améliorée du retour de plusieurs enfants à partir d'une méthode de rendu de composants sans spécifier de clés dans les enfants:
Si vous utilisez une version de React antérieure à la v16.2.0, il est également possible d'utiliser à la
<React.Fragment>...</React.Fragment>
place:Original:
React v16.0 a introduit le retour d'un tableau d'éléments dans la méthode de rendu sans l'envelopper dans un div: https://reactjs.org/blog/2017/09/26/react-v16.0.html
Pour le moment, une clé est requise pour chaque élément afin d'éviter l'avertissement de clé, mais cela pourrait être modifié dans les versions futures:
la source
Vous pouvez utiliser:
Pour plus de détails, reportez-vous à cette documentation .
la source
Utilisez [] au lieu de () pour encapsuler le retour entier.
la source
J'ai créé un composant pour envelopper les composants enfants sans DIV. Cela s'appelle un wrapper d'ombre: https://www.npmjs.com/package/react-shadow-wrapper
la source
Ceci est toujours nécessaire , MAIS React assurez-vous maintenant de créer des éléments sans créer d'élément DOM supplémentaire.
L'emballage supplémentaire nécessaire (normalement avec un parent
div
) car lacreateElement
méthode Reacts nécessite untype
paramètre qui esteither a tag name string (such as 'div' or 'span'), a React component type (a class or a function)
. Mais c'était avant l'introduction de ReactFragment
.Référez - vous à ce NOUVEAU doc api pour createElement
voici l'exemple officiel, Refer React.Fragment .
la source
Vous ne pourrez pas vous débarrasser de cet
div
élément. React.render () doit renvoyer un nœud DOM valide.la source
Voici une façon de rendre les composants "transculents":
la source
Il existe également une solution de contournement. Le code de bloc ci-dessous génère un fragment sans avoir besoin de React.Fragment.
la source
Je sais que cette question a été répondue, vous pouvez bien sûr utiliser React.Fragment qui ne crée pas de nœud mais vous permet de regrouper des éléments comme un div.
De plus, si vous voulez vous amuser, vous pouvez implémenter (et apprendre beaucoup de choses) un mode React qui supprime les div supplémentaires et pour cela, je veux vraiment partager une excellente vidéo sur la façon dont vous pouvez le faire sur la base de code de réaction elle-même.
https://www.youtube.com/watch?v=aS41Y_eyNrU
Ce n'est bien sûr pas quelque chose que vous feriez dans la pratique, mais c'est une bonne opportunité d'apprentissage.
la source