Ich folge einem Code-Snippet aus dem Buch React Quickly
.
Und ich kann den Code nicht ausführen, nachdem er über Babel kompiliert wurde.
Mein Code lautet wie folgt:
class DateTimeNow extends React.Component{
render(){
let dateTimeNow = new Date();
return <span>Current date and time is {dateTimeNow}.</span>;
}
}
ReactDOM.render(
<DateTimeNow/>,
document.getElementById('content')
);
Die vom Browser gemeldete Fehlermeldung lautet:
Uncaught Invariant Violation: Objects are not valid as a React child (found: Mon Oct 17 2016 09:12:00 GMT+0800 (CST)). If you meant to render a collection of children, use an array instead or wrap the object using createFragment(object) from the React add-ons. Check the render method of
DateTimeNow .
Könnten Sie bitte helfen, zu beantworten, warum es einen Fehler verursacht?
Vielen Dank!
Möchten Sie ein _Feature_ anfordern oder einen _Bug_ melden?
Wie ist das aktuelle Verhalten?
Fehlermeldung: Nicht abgefangene unveränderliche Verletzung: Objekte sind nicht als untergeordnetes React-Objekt gültig (gefunden: Mo 17.10.2016 09:12:00 GMT+0800 (CST)). Wenn Sie eine Sammlung von untergeordneten Elementen rendern möchten, verwenden Sie stattdessen ein Array oder wickeln Sie das Objekt mit createFragment(object) aus den React-Add-Ons ein. Überprüfen Sie die Rendermethode von DateTimeNow
.
Wenn das aktuelle Verhalten ein Fehler ist, stellen Sie bitte die Schritte zur Reproduktion und wenn möglich eine minimale Demo des Problems über https://jsfiddle.net oder ähnlich bereit (Vorlage: https://jsfiddle.net/reactjs/69z2wepo/).
Was ist das erwartete Verhalten?
span-Tag zeigt die aktuelle Uhrzeit an
Welche React-Versionen und welche Browser/Betriebssysteme sind von diesem Problem betroffen?
Reagieren 15.3.2
Die kurze Antwort ist, dass Sie eine toString()
Methode für Ihre dateTimeNow-Variable aufrufen müssen, da es sich um ein Datums-_Objekt_ und nicht um eine Zeichenfolge handelt. dh eines der 'Objekte', auf das sich die Fehlermeldung bezieht.
return <span>Current date and time is {dateTimeNow.toUTCString()}.</span>;
Die Fehlermeldung ist jedoch zunächst verwirrend, da sie das Datum einfach als Zeichenfolge rendert. Wenn Sie beispielsweise {dateTimeNow}
durch ein Objekt wie { {a: 1} }
ersetzen, {dateTimeNow}
die Fehlermeldung etwas mehr Sinn:
Uncaught Error: Objects are not valid as a React child (found: object with keys {a}).
https://github.com/facebook/react/issues/7988#issuecomment -254148427 ist korrekt.
Datumsangaben sind Objekte in JS, aber Ihre Renderausgabe darf nur React-Elemente, Strings und Zahlen enthalten. Das Formatieren eines Strings mit einer beliebigen toString()
-ähnlichen Methode wird funktionieren.
Eine Liste solcher Methoden finden Sie auf MDN .
Beifall!
Warum kann React nicht automatisch .toString()
für uns aufrufen, eine lá-String-Interpolation? Zu viel Overhead?
Hilfreichster Kommentar
Die kurze Antwort ist, dass Sie eine
toString()
Methode für Ihre dateTimeNow-Variable aufrufen müssen, da es sich um ein Datums-_Objekt_ und nicht um eine Zeichenfolge handelt. dh eines der 'Objekte', auf das sich die Fehlermeldung bezieht.Die Fehlermeldung ist jedoch zunächst verwirrend, da sie das Datum einfach als Zeichenfolge rendert. Wenn Sie beispielsweise
{dateTimeNow}
durch ein Objekt wie{ {a: 1} }
ersetzen,{dateTimeNow}
die Fehlermeldung etwas mehr Sinn: