J'essaie de configurer mon React.js
application pour qu'elle s'affiche uniquement si une variable que j'ai définie l'est true
.
La façon dont ma fonction de rendu est configurée ressemble à ceci:
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>
)
},
Fondamentalement, la partie importante ici est la if(this.state.submitted==false)
partie (je veux que ces div
éléments apparaissent lorsque la variable soumise est définie sur false
).
Mais lors de l'exécution, j'obtiens l'erreur dans la question:
Erreur non interceptée: erreur d'analyse: ligne 38: les éléments JSX adjacents doivent être enveloppés dans une balise englobante
Quel est le problème ici? Et que puis-je utiliser pour que cela fonctionne?
javascript
reactjs
render
user1072337
la source
la source
Réponses:
Vous devez placer votre composant entre une balise englobante, ce qui signifie:
Au lieu:
Edit: le commentaire de Per Joe Clay sur l' API Fragments
la source
Il est tard pour répondre à cette question mais je pensais que cela ajouterait à l'explication.
Cela se produit parce que n'importe où dans votre code, vous renvoyez deux éléments simultanément.
par exemple
Il doit être enveloppé dans un élément parent . par exemple
Explication plus détaillée
Votre
jsx
code ci-dessous se transformedans ce
Mais si tu fais ça
cela est converti en ceci (juste à des fins d'illustration, en fait, vous obtiendrez
error : Adjacent JSX elements must be wrapped in an enclosing tag
)Dans le code ci-dessus, vous pouvez voir que vous essayez de retourner deux fois à partir d'un appel de méthode, ce qui est évidemment faux.
Edit- Dernières modifications dans React 16 et propres:
Si vous ne souhaitez pas ajouter de div supplémentaire à boucler et que vous souhaitez renvoyer plusieurs composants enfants, vous pouvez les utiliser
React.Fragments
.React.Fragments
sont un peu plus rapides et utilisent moins de mémoire (pas besoin de créer un nœud DOM supplémentaire, moins d'arbre DOM encombré).par exemple (In React 16.2.0)
ou
ou
la source
L'élément React ne doit renvoyer qu'un seul élément. Vous devrez envelopper vos deux balises avec une autre balise d'élément.
Je peux également voir que votre fonction de rendu ne renvoie rien. Voici à quoi devrait ressembler votre composant:
Notez également que vous ne pouvez pas utiliser d'
if
instructions à l'intérieur d'un élément renvoyé:la source
Si vous ne voulez pas l'encapsuler dans une autre div comme l'ont suggéré d'autres réponses, vous pouvez également l'encapsuler dans un tableau et cela fonctionnera.
Il peut s'écrire:
Veuillez noter que ce qui précède générera un avertissement:
Warning: Each child in an array or iterator should have a unique "key" prop. Check the render method of 'YourComponent'.
Cela peut être résolu en ajoutant un
key
attribut aux composants, si vous les ajoutez manuellement, ajoutez-le comme:Voici quelques informations supplémentaires sur les clés: Composition vs Héritage
la source
Le problème
Cela signifie que vous essayez de renvoyer plusieurs éléments JSX frères de manière incorrecte. N'oubliez pas que vous n'écrivez pas du HTML, mais du JSX! Votre code est transposé de JSX en JavaScript. Par exemple:
sera transposé en:
Sauf si vous êtes nouveau dans la programmation en général, vous savez déjà que les fonctions / méthodes (de n'importe quel langage) prennent un certain nombre de paramètres mais ne renvoient toujours qu'une seule valeur. Cela étant, vous pouvez probablement constater qu'un problème survient lorsque vous essayez de renvoyer plusieurs composants frères en fonction de la façon dont
createElement()
fonctionne; il ne prend des paramètres que pour un élément et le renvoie. Par conséquent, nous ne pouvons pas renvoyer plusieurs éléments d'un même appel de fonction.Donc, si vous vous êtes déjà demandé pourquoi cela fonctionne ...
mais pas ça ...
c'est parce que dans le premier extrait, les deux
<p>
éléments font partiechildren
de l'<div>
élément. Lorsqu'ils en font partie,children
nous pouvons exprimer un nombre illimité d'éléments frères. Jetez un œil à la façon dont cela se transposerait:Solutions
Selon la version de React que vous utilisez, vous disposez de quelques options pour résoudre ce problème:
Utilisez des fragments (React v16.2 + uniquement!)
À partir de React v16.2, React prend en charge les fragments, qui est un composant sans nœud qui renvoie directement ses enfants.
Le retour des enfants dans un tableau (voir ci-dessous) présente certains inconvénients:
Ceux-ci sont éliminés de l'utilisation de fragments. Voici un exemple d'enfants enveloppés dans un fragment:
qui désucre en:
Notez que le premier extrait nécessite Babel v7.0 ou supérieur.
Retourne un tableau (React v16.0 + uniquement!)
À partir de React v16, React Components peut renvoyer des tableaux. C'est différent des versions antérieures de React où vous étiez obligé d'envelopper tous les composants frères dans un composant parent.
En d'autres termes, vous pouvez désormais:
cela se traduit par:
Notez que ce qui précède renvoie un tableau. Les tableaux sont des éléments React valides depuis React version 16 et ultérieure. Pour les versions antérieures de React, les tableaux ne sont pas des objets de retour valides!
Notez également que ce qui suit n'est pas valide (vous devez renvoyer un tableau):
Envelopper les éléments dans un élément parent
L'autre solution consiste à créer un composant parent qui encapsule les composants frères dans son
children
. C'est de loin le moyen le plus courant de résoudre ce problème et fonctionne dans toutes les versions de React.Remarque: Jetez un coup d'œil à nouveau en haut de cette réponse pour plus de détails et comment cela se transpile .
la source
v16.4
le premier exemple ne fonctionne pas en utilisant<>
<React.Fragment>
React 16.0.0 nous pouvons renvoyer plusieurs composants du rendu sous forme de tableau.
React 16.4.0 nous pouvons renvoyer plusieurs composants du rendu dans une balise Fragment. Fragment
Future React vous pourrez utiliser cette syntaxe abrégée. (de nombreux outils ne le prennent pas encore en charge, vous pouvez donc écrire de manière explicite
<Fragment>
jusqu'à ce que l'outillage rattrape.)la source
,
entre les composants. C'est un tableau, vous devez donc séparer chaque élément qu'il contient.<Fragment>
, c'est<React.Fragment>
. le dit dans votre propre lienimport React { Fragment } from 'react';
vous l'utilisez comme ceci<Fragment >
Si vous n'encapsulez pas votre composant, vous pouvez l'écrire comme indiqué ci-dessous.
Au lieu de:
vous pouvez écrire ceci:
la source
c'est très simple, nous pouvons utiliser un élément parent div pour envelopper tous les éléments ou nous pouvons utiliser le concept de composant d'ordre supérieur (HOC), c'est-à-dire très utile pour réagir aux applications js
ou une autre meilleure façon est HOC c'est très simple pas très compliqué il suffit d'ajouter un fichier hoc.js dans votre projet et d'ajouter simplement ces codes
maintenant, importez le fichier hoc.js où vous voulez utiliser, maintenant au lieu d'envelopper avec l'élément div, nous pouvons envelopper avec hoc.
la source
Il existe une règle selon laquelle une expression JSX doit avoir exactement un élément le plus à l'extérieur.
faux
correct
la source
React 16 obtient votre retour sous forme de tableau, il doit donc être enveloppé par un élément comme div.
Mauvaise approche
Approche à droite (tous les éléments d'une division ou d'un autre élément que vous utilisez)
la source
Les composants React doivent être enveloppés dans un seul conteneur, qui peut être n'importe quelle balise, par exemple "<div> .. </ div>"
Vous pouvez vérifier la méthode de rendu de ReactCSSTransitionGroup
la source
Importez la vue et encapsulez
View
. Envelopper dans undiv
ne fonctionnait pas pour moi.la source
View
n'est pas vraiment la meilleure solution.Non valide: pas seulement les éléments enfants
Valide: élément racine sous les éléments enfants
la source
Pour les développeurs Rect-Native. Je rencontre cette erreur lors du rendu d'Item dans FlatList. J'avais deux composants Text. Je les utilisais comme ci-dessous
Mais après avoir installé ces composants de vue intérieure, cela a fonctionné pour moi.
Vous utilisez peut-être d'autres composants, mais leur mise en vue peut être utile pour vous.
la source
View
n'est pas vraiment la meilleure solution.Je pense que la complication peut également se produire lorsque vous essayez d'imbriquer plusieurs Divs dans l'instruction return. Vous pouvez le faire pour vous assurer que vos composants s'affichent en tant qu'éléments de bloc.
Voici un exemple de rendu correct de deux composants, en utilisant plusieurs divs.
la source
J'ai eu un problème qui a généré cette erreur qui n'était pas évidente tous ensemble.
Et voici la solution ...
Allez comprendre. Informations partagées ici au cas où d'autres frapperaient cette bosse. Apparemment, vous ne pouvez pas avoir un nom de classe d'élément identique à son nom de fonction parent React.
la source