In der Renderfunktion meiner Komponente habe ich:
render() {
const items = ['EN', 'IT', 'FR', 'GR', 'RU'].map((item) => {
return (<li onClick={this.onItemClick.bind(this, item)} key={item}>{item}</li>);
});
return (
<div>
...
<ul>
{items}
</ul>
...
</div>
);
}
Alles wird gut, aber wenn Sie auf klicken <li>
ich Element klicke, erhalte ich die folgende Fehlermeldung:
Nicht erfasster Fehler: Invariante Verletzung: Objekte sind als untergeordnetes Reagieren nicht gültig (gefunden: Objekt mit Schlüsseln {dispatchConfig, dispatchMarker, nativeEvent, Ziel, aktuelles Ziel, Typ, eventPhase, Blasen, stornierbar, Zeitstempel, defaultPrevented, isTrusted, Ansicht, Detail, screenX , screenY, clientX, clientY, ctrlKey, shiftKey, altKey, metaKey, getModifierState, Schaltfläche, Schaltflächen, relatedTarget, pageX, pageY, isDefaultPrevented, isPropagationStopped, _dispatchListeners, _dispatchIDs}). Wenn Sie eine Sammlung von untergeordneten Elementen rendern möchten, verwenden Sie stattdessen ein Array oder schließen Sie das Objekt mit createFragment (Objekt) aus den React-Add-Ons ein. Überprüfen Sie die Rendermethode von
Welcome
.
Wenn ich zu wechsle this.onItemClick.bind(this, item)
, um (e) => onItemClick(e, item)
innerhalb der Map - Funktion funktioniert alles wie erwartet.
Wenn jemand erklären könnte, was ich falsch mache und warum ich diesen Fehler bekomme, wäre das großartig
UPDATE 1:
Die Funktion onItemClick lautet wie folgt : Wenn Sie this.setState entfernen, verschwindet der Fehler.
onItemClick(e, item) {
this.setState({
lang: item,
});
}
Ich kann diese Zeile jedoch nicht entfernen, da ich den Status dieser Komponente aktualisieren muss
quelle
this.onItemClick
wird das umgesetzt?Antworten:
Ich hatte diesen Fehler und es stellte sich heraus, dass ich unbeabsichtigt ein Objekt in meinen JSX-Code aufgenommen habe, von dem ich erwartet hatte, dass es ein Zeichenfolgenwert ist:
breadcrumbElement
Früher war es eine Zeichenfolge, aber aufgrund eines Refaktors war es ein Objekt geworden. Leider hat die Fehlermeldung von React nicht gut dazu beigetragen, mich auf die Zeile zu verweisen, in der das Problem bestand. Ich musste meinem Stack-Trace bis zum Ende folgen, bis ich erkannte, dass die "Requisiten" an eine Komponente übergeben wurden, und dann den fehlerhaften Code fand.Sie müssen entweder auf eine Eigenschaft des Objekts verweisen, bei der es sich um einen Zeichenfolgenwert handelt, oder das Objekt in eine Zeichenfolgendarstellung konvertieren, die wünschenswert ist. Eine Option könnte sein
JSON.stringify
wenn Sie den Inhalt des Objekts tatsächlich sehen möchten.quelle
Ich habe diesen Fehler erhalten, als ich versucht habe, die
createdAt
Eigenschaft anzuzeigen, bei der es sich um ein Datumsobjekt handelt. Wenn Sie.toString()
am Ende so verketten , wird die Konvertierung durchgeführt und der Fehler behoben. Posten Sie dies einfach als mögliche Antwort, falls jemand anderes auf dasselbe Problem stößt:quelle
objects are not valid
invariante Verletzung nur auslösen, wenn ich eine Zeile hinzufüge . Es stellte sich heraus, dass ich das Date () -Objekt in eine Zeichenfolge konvertiert habe, bevor ich es beibehalten habe, sodass nur meine neuen Zeilen Objekte für das Erstellungsdatum hatten. :( Lerne von meinen eigensinnigen Beispielleuten!Ich habe nur den gleichen Fehler erhalten, aber aufgrund eines anderen Fehlers: Ich habe doppelte Klammern verwendet wie:
um den Wert von
count
anstelle des richtigen einzufügen :in die sich der Compiler vermutlich verwandelt hat
{{count: count}}
, dh versucht, ein Objekt als React-Kind einzufügen.quelle
{}
. Das innere Paar wird als ES6-Code behandelt. In ES6{count}
ist das gleiche wie{count: count}
. Wenn Sie also tippen{{count}}
, ist das genau das gleiche wie{ {count: count} }
.this.state = {navMenuItems: {navMenu}};
... was meine JSX im GrundenavMenu
in ein generisches Objekt verwandelte . Ändern,this.state = {navMenuItems: navMenu};
um die unbeabsichtigte "Besetzung" zuObject
beseitigen und das Problem zu beheben.Ich dachte nur, ich würde das ergänzen, da ich heute das gleiche Problem hatte. Es stellte sich heraus, dass es daran lag, dass ich nur die Funktion zurückgab, als ich sie in ein
<div>
Tag einwickelte , das wie unten zu funktionieren begannDas Obige hat den Fehler verursacht. Ich habe das Problem behoben, indem ich den
return()
Abschnitt geändert habe in:...oder einfach:
quelle
return gallerySection
wenn Sie eine zusätzliche vermeiden möchtendiv
gallerySection
statt<div>{gallerySection}</div>
mir geholfen zu haben.Das untergeordnete Kind (Singular) sollte ein primitiver Datentyp sein, kein Objekt, oder es könnte ein JSX-Tag sein (was in unserem Fall nicht der Fall ist). . Verwenden Sie das Proptypes-Paket in der Entwicklung, um sicherzustellen, dass die Validierung erfolgt.
Nur ein kurzer Vergleich von Code-Snippets (JSX), um Sie mit einer Idee darzustellen:
Fehler: Wenn das Objekt an das Kind übergeben wird
Ohne Fehler: Wenn die Eigenschaft des Objekts ( die primitiv sein sollte, dh ein Zeichenfolgenwert oder ein ganzzahliger Wert ) an das untergeordnete Element übergeben wird.
TLDR; (Aus der folgenden Quelle): Stellen Sie sicher, dass alle Elemente, die Sie in JSX rendern, Grundelemente und keine Objekte sind, wenn Sie React verwenden. Dieser Fehler tritt normalerweise auf, weil einer Funktion, die am Auslösen eines Ereignisses beteiligt ist, ein unerwarteter Objekttyp zugewiesen wurde (dh ein Objekt übergeben, wenn Sie eine Zeichenfolge übergeben sollten) oder ein Teil der JSX in Ihrer Komponente nicht auf ein Grundelement verweist (dh this.props) vs this.props.name).
Quelle - Kodierungbismuth.com
quelle
return <p>{item.whatever}</p>;
Meins hatte damit zu tun, unnötig geschweifte Klammern um eine Variable zu setzen, die ein HTML-Element in der return-Anweisung der Funktion render () enthält. Dies veranlasste React, es eher als Objekt als als Element zu behandeln.
Nachdem ich die geschweiften Klammern aus dem Element entfernt hatte, war der Fehler behoben und das Element wurde korrekt gerendert.
quelle
Meins hatte damit zu tun, die geschweiften Klammern um Requisiten zu vergessen, die an eine Präsentationskomponente gesendet wurden:
Vor:
Nach
quelle
Auch ich habe den Fehler "Objekte sind als untergeordnetes Element nicht gültig" erhalten, und für mich war die Ursache der Aufruf einer asynchronen Funktion in meinem JSX. Siehe unten.
Ich habe gelernt, dass asynchrones Rendern in React nicht unterstützt wird. Das React-Team arbeitet an einer Lösung, wie hier dokumentiert .
quelle
Für alle, die Firebase mit Android verwenden, ist Android nur defekt. Meine iOS-Emulation ignoriert es.
Und wie oben von Apoorv Bankey gepostet.
Alles über Firebase V5.0.3 für Android, atm ist eine Pleite. Fix:
Hier mehrfach bestätigt https://github.com/firebase/firebase-js-sdk/issues/871
quelle
Ich habe auch das gleiche Problem, aber mein Fehler ist so dumm. Ich habe versucht, direkt auf das Objekt zuzugreifen.
quelle
Wenn Sie aus irgendeinem Grund Firebase importiert haben. Versuchen Sie dann zu laufen
npm i --save [email protected]
. Dies liegt daran, dass die Firebase-Pause reaktionsnativ ist. Wenn Sie dies ausführen, wird dies behoben.quelle
In meinem Fall habe ich vergessen, ein HTML-Element aus der Renderfunktion zurückzugeben, und ich habe ein Objekt zurückgegeben. Was ich getan habe, war, dass ich die {Elemente} einfach mit einem HTML-Element umwickelt habe - einem einfachen Div wie unten
quelle
Ich hatte das gleiche Problem, weil ich das nicht
props
in die geschweiften Klammern gesteckt habe .Wenn Ihr Code dem obigen ähnlich ist, wird dieser Fehler angezeigt. Um dies zu beheben, setzen Sie einfach geschweifte Klammern um die
props
.quelle
Ich habe den gleichen Fehler bekommen, ich habe das geändert
export default withAlert(Alerts)
dazu
export default withAlert()(Alerts)
.In älteren Versionen war der frühere Code in Ordnung, in späteren Versionen wird jedoch ein Fehler ausgegeben. Verwenden Sie daher den späteren Code, um den Fehler zu vermeiden.
quelle
In meinem Fall trat der Fehler auf, weil ich das Elementarray in geschweiften Klammern zurückgegeben habe, anstatt nur das Array selbst zurückzugeben.
Code mit Fehler
Richtiger Code
quelle
Sie haben nur die Schlüssel des Objekts anstelle des gesamten Objekts verwendet!
Weitere Details finden Sie hier: https://github.com/gildata/RAIO/issues/48
quelle
Ich habe das gleiche Problem, in meinem Fall aktualisiere ich den Redux Status und die neuen Datenparameter stimmen nicht mit den alten Parametern überein. Wenn ich also über diesen Fehler auf einige Parameter zugreifen möchte,
Vielleicht hilft diese Erfahrung jemandem
quelle
Wenn Sie Firebase verwenden und diesen Fehler sehen, sollten Sie überprüfen, ob Sie ihn richtig importieren. Ab Version 5.0.4 müssen Sie es folgendermaßen importieren:
Ja, ich weiß. Auch hier habe ich 45 Minuten verloren.
quelle
In der Regel wird dies angezeigt, weil Sie nicht richtig zerstören. Nehmen Sie diesen Code zum Beispiel:
Wir erklären es mit dem
= text =>
Parameter. Aber wirklich, React erwartet, dass dies ein allumfassendesprops
Objekt ist.Also sollten wir wirklich so etwas tun:
Beachten Sie den Unterschied? Der
props
Parameter hier könnte alles heißen (props
ist nur die Konvention, die der Nomenklatur entspricht). React erwartet nur ein Objekt mit Schlüsseln und Werten.Mit der Objektzerstörung können Sie Folgendes tun und werden es häufig sehen:
... was funktioniert.
Es besteht die Möglichkeit, dass jeder, der darauf stößt, versehentlich den Requisitenparameter seiner Komponente deklariert hat, ohne ihn zu zerstören.
quelle
Ich habe mich gerade einer wirklich dummen Version dieses Fehlers unterzogen, die ich hier auch für die Nachwelt teilen kann.
Ich hatte eine JSX wie diese:
Ich musste dies auskommentieren, um etwas zu debuggen. Ich habe die Tastenkombination in meiner IDE verwendet, was dazu führte:
Was natürlich ungültig ist - Objekte gelten nicht als reagierende Kinder!
quelle
Ich möchte dieser Liste eine weitere Lösung hinzufügen.
Technische Daten:
Ich habe den gleichen Fehler festgestellt:
Das war mein Code:
Lösung:
Das Problem trat auf, weil die Nutzlast den Artikel als Objekt sendete. Als ich die Nutzlastvariable entfernte und den userInput-Wert in den Versand einfügte, funktionierte alles wie erwartet.
quelle
Wenn Sie Firebase verwenden, eine der Dateien in Ihrem Projekt. Dann platzieren Sie einfach diese Import-Firebase-Anweisung am Ende !!
Ich weiß, das klingt verrückt, aber probier es aus !!
quelle
Mein Problem war einfach, als ich auf folgenden Fehler stieß:
Ich habe nur ein Objekt mit den im Fehler angegebenen Schlüsseln übergeben, während ich versucht habe, das Objekt direkt in einer Komponente mit {object} zu rendern, wobei ich erwartet habe, dass es eine Zeichenfolge ist
Beim Rendern auf einer React-Komponente habe ich etwas wie das Folgende verwendet
aber es hätte sein sollen
quelle
Wenn Sie zustandslose Komponenten verwenden, gehen Sie wie folgt vor:
Das schien für mich zu funktionieren
quelle
So etwas ist mir gerade passiert ...
Ich hab geschrieben:
Das Platzieren in einem Div hat es behoben:
quelle
Was bedeutet, dass Sie etwas übergeben, ist ein Schlüsselwert. Sie müssen also Ihren Handler ändern:
von zuDu hast die Klammern verpasst (
{}
).quelle
In meinem Fall habe ich meiner untergeordneten Funktionskomponente eine asynchrone Funktion hinzugefügt und bin auf diesen Fehler gestoßen. Verwenden Sie Async nicht mit untergeordneter Komponente.
quelle
Wenn es bei Verwendung von Firebase nicht funktioniert, indem Sie das Ende von
import
Anweisungen einfügen, können Sie versuchen, dies in eine der Lebenszyklusmethoden einzufügen, dh Sie können es in diese einfügencomponentWillMount()
.quelle
Invariant Violation: Objects are not valid as a React child
ist mir passiert, als ich eine Komponente verwendet habe, dierenderItem
Requisiten benötigt , wie:und mein Fehler war, meine
renderItem
Methode zu machenasync
.quelle
Mein Fehler war, weil ich es so geschrieben habe:
anstatt:
Es bedeutete, dass ich versuchte, ein Objekt anstelle des darin enthaltenen Werts zu rendern.
Bearbeiten: Dies ist für nicht native reagieren.
quelle