Ich versuche, meine React.js
App so einzurichten, dass sie nur gerendert wird, wenn eine von mir festgelegte Variable ist true
.
Die Art und Weise, wie meine Renderfunktion eingerichtet ist, sieht folgendermaßen aus:
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>
)
},
Grundsätzlich ist der wichtige Teil hier der if(this.state.submitted==false)
Teil (ich möchte, dass diese div
Elemente angezeigt werden, wenn die übermittelte Variable auf gesetzt ist false
).
Aber wenn ich das ausführe, bekomme ich den Fehler in der Frage:
Nicht erfasster Fehler: Analysefehler: Zeile 38: Benachbarte JSX-Elemente müssen in ein umschließendes Tag eingeschlossen werden
Was ist das Problem hier? Und womit kann ich diese Arbeit machen?
javascript
reactjs
render
user1072337
quelle
quelle
Antworten:
Sie sollten Ihre Komponente zwischen ein umschließendes Tag setzen. Dies bedeutet:
Stattdessen:
Bearbeiten: Per Joe Clay's Kommentar zur Fragment-API
quelle
Es ist spät, diese Frage zu beantworten, aber ich dachte, es wird die Erklärung ergänzen.
Dies geschieht, weil an einer beliebigen Stelle in Ihrem Code zwei Elemente gleichzeitig zurückgegeben werden.
z.B
Es sollte in ein übergeordnetes Element eingeschlossen werden. z.B
Detailliertere Erklärung
Ihr unten stehender
jsx
Code wird transformiertdas sehr gut finden
Aber wenn du das tust
dies wird in dieses umgewandelt (nur zur Veranschaulichung, tatsächlich werden Sie bekommen
error : Adjacent JSX elements must be wrapped in an enclosing tag
)Im obigen Code können Sie sehen, dass Sie versuchen, zweimal von einem Methodenaufruf zurückzukehren, was offensichtlich falsch ist.
Bearbeiten - Neueste Änderungen in React 16 und eigenen Stationen:
Wenn Sie kein zusätzliches div zum Umschließen hinzufügen möchten und mehr als eine untergeordnete Komponente zurückgeben möchten, können Sie damit arbeiten
React.Fragments
.React.Fragments
sind etwas schneller und haben weniger Speicherbedarf (kein zusätzlicher DOM-Knoten erforderlich, weniger überfüllter DOM-Baum).zB (In Reaktion 16.2.0)
oder
oder
quelle
Das React-Element muss nur ein Element zurückgeben. Sie müssen beide Tags mit einem anderen Element-Tag umschließen.
Ich kann auch sehen, dass Ihre Renderfunktion nichts zurückgibt. So sollte Ihre Komponente aussehen:
Beachten Sie auch, dass Sie keine
if
Anweisungen innerhalb eines zurückgegebenen Elements verwenden können:quelle
Wenn Sie es nicht in ein anderes Div einschließen möchten, wie andere Antworten vorgeschlagen haben, können Sie es auch in ein Array einschließen, und es funktioniert.
Es kann geschrieben werden als:
Bitte beachten Sie, dass oben eine Warnung generiert wird:
Warning: Each child in an array or iterator should have a unique "key" prop. Check the render method of 'YourComponent'.
Dies kann durch Hinzufügen eines
key
Attributs zu den Komponenten behoben werden. Wenn Sie diese manuell hinzufügen, fügen Sie es wie folgt hinzu:Hier finden Sie weitere Informationen zu Schlüsseln: Zusammensetzung vs. Vererbung
quelle
Das Problem
Dies bedeutet, dass Sie versuchen, mehrere Geschwister-JSX-Elemente auf falsche Weise zurückzugeben. Denken Sie daran, dass Sie nicht HTML schreiben, sondern JSX! Ihr Code wird von JSX in JavaScript übertragen. Zum Beispiel:
wird transpiliert in:
Sofern Sie mit der Programmierung im Allgemeinen noch nicht vertraut sind, wissen Sie bereits, dass Funktionen / Methoden (jeder Sprache) eine beliebige Anzahl von Parametern annehmen, aber immer nur einen Wert zurückgeben. Angesichts dessen können Sie wahrscheinlich feststellen, dass ein Problem auftritt, wenn Sie versuchen, mehrere Geschwisterkomponenten basierend auf der Funktionsweise zurückzugeben
createElement()
. Es werden nur Parameter für ein Element verwendet und diese zurückgegeben. Daher können wir nicht mehrere Elemente aus einem Funktionsaufruf zurückgeben.Also, wenn Sie sich jemals gefragt haben, warum das funktioniert ...
aber nicht das ...
es ist , weil in dem ersten Schnipsel, beide
<p>
-Elemente Teile sindchildren
der<div>
-elementigen. Wenn sie Teil von sindchildren
, können wir eine unbegrenzte Anzahl von Geschwisterelementen ausdrücken. Schauen Sie sich an, wie sich dies auswirken würde:Lösungen
Abhängig davon, welche Version von React Sie ausführen, haben Sie einige Optionen, um dies zu beheben:
Verwenden Sie Fragmente (Reagieren Sie nur auf Version 16.2 +!)
Ab React v16.2 unterstützt React Fragmente , eine knotenlose Komponente, die ihre untergeordneten Elemente direkt zurückgibt.
Das Zurückgeben der untergeordneten Elemente in einem Array (siehe unten) hat einige Nachteile:
Diese werden bei der Verwendung von Fragmenten eliminiert. Hier ist ein Beispiel für Kinder, die in ein Fragment eingewickelt sind:
welche Entzucker in:
Beachten Sie, dass für das erste Snippet Babel v7.0 oder höher erforderlich ist.
Geben Sie ein Array zurück (Reagieren Sie nur auf Version 16.0 +!)
Ab React v16 können React Components Arrays zurückgeben. Dies ist anders als in früheren Versionen von React, in denen Sie gezwungen waren, alle Geschwisterkomponenten in eine übergeordnete Komponente zu packen.
Mit anderen Worten, Sie können jetzt Folgendes tun:
dies überträgt sich in:
Beachten Sie, dass das oben Gesagte ein Array zurückgibt. Arrays sind seit React Version 16 und höher gültige React Elements. In früheren Versionen von React sind Arrays keine gültigen Rückgabeobjekte!
Beachten Sie außerdem, dass Folgendes ungültig ist (Sie müssen ein Array zurückgeben):
Wickeln Sie die Elemente in ein übergeordnetes Element ein
Die andere Lösung besteht darin, eine übergeordnete Komponente zu erstellen, die die Geschwisterkomponenten in ihre einschließt
children
. Dies ist bei weitem die häufigste Methode, um dieses Problem zu beheben, und funktioniert in allen Versionen von React.Hinweis: Schauen Sie oben in dieser Antwort noch einmal nach, um weitere Details zu erfahren und wie sich dies auswirkt .
quelle
v16.4
das erste Beispiel funktioniert nicht mit :<>
, nur<React.Fragment>
:(In Reaktion 16.0.0 können wir mehrere Komponenten aus dem Rendering als Array zurückgeben.
In 16.4.0 können wir mehrere Komponenten aus dem Rendering in einem Fragment-Tag zurückgeben. Fragment
Future React Sie können diese Kurzsyntax verwenden. (Viele Tools unterstützen es noch nicht, daher möchten Sie möglicherweise explizit schreiben,
<Fragment>
bis das Tool aufholt.)quelle
,
zwischen den Komponenten vergessen . Da es sich um ein Array handelt, müssen Sie jedes Element darin trennen.<Fragment>
, es ist<React.Fragment>
. sagt so in Ihrem eigenen Linkimport React { Fragment } from 'react';
dann verwenden Sie es so<Fragment >
Wenn Sie Ihre Komponente nicht umschließen, können Sie sie wie unten beschrieben schreiben.
Anstatt:
Sie können dies schreiben:
quelle
Es ist sehr einfach, ein übergeordnetes Element div zu verwenden, um das gesamte Element zu verpacken, oder wir können das HOC-Konzept (Higher Order Component) verwenden, das sehr nützlich ist, um js-Anwendungen zu reagieren
oder ein anderer bester Weg ist HOC, es ist sehr einfach, nicht sehr kompliziert. Fügen Sie einfach eine Datei hoc.js in Ihr Projekt ein und fügen Sie einfach diese Codes hinzu
Importieren Sie jetzt die Datei hoc.js, die Sie verwenden möchten. Statt mit dem div-Element zu umbrechen, können wir jetzt mit hoc umbrechen.
quelle
Es gibt eine Regel in der Reaktion, dass ein JSX-Ausdruck genau ein äußerstes Element haben muss.
falsch
richtig
quelle
React 16 erhält Ihre Rückgabe als Array, sodass es von einem Element wie div umschlossen werden sollte.
Falscher Ansatz
Richtiger Ansatz (Alle Elemente in einem Div oder einem anderen Element, das Sie verwenden)
quelle
Reaktionskomponenten müssen in einem einzelnen Container verpackt sein. Dies kann ein beliebiges Tag sein, z. B. "<div> .. </ div>".
Sie können die Rendermethode von ReactCSSTransitionGroup überprüfen
quelle
Ansicht importieren und einbinden
View
. Das Einwickeln in adiv
hat bei mir nicht funktioniert.quelle
View
nicht wirklich die beste Lösung ist.Ungültig: Nicht nur untergeordnete Elemente
Gültig: Stammelement unter untergeordneten Elementen
quelle
Für Rect-Native-Entwickler. Dieser Fehler tritt beim Rendern von Item in FlatList auf. Ich hatte zwei Textkomponenten. Ich habe sie wie unten benutzt
Aber nachdem ich diese zwei Inside View-Komponenten eingesetzt hatte, funktionierte es für mich.
Möglicherweise verwenden Sie andere Komponenten, aber das Einfügen in View kann für Sie hilfreich sein.
quelle
View
ist a nicht wirklich die beste Lösung.Ich denke, die Komplikation kann auch auftreten, wenn versucht wird, mehrere Divs in der return-Anweisung zu verschachteln. Möglicherweise möchten Sie dies tun, um sicherzustellen, dass Ihre Komponenten als Blockelemente gerendert werden.
Hier ist ein Beispiel für das korrekte Rendern einiger Komponenten mit mehreren Divs.
quelle
Ich hatte ein Problem, das diesen Fehler verursachte, der insgesamt nicht offensichtlich war.
Und hier war die Lösung ...
Stelle dir das vor. Hier geteilte Informationen für den Fall, dass andere diese Beule treffen. Anscheinend können Sie keinen Elementklassennamen haben, der mit dem Namen der übergeordneten React-Funktion identisch ist.
quelle