Der Titel sagt alles. Ich verstehe, warum dies componentDidMountfür alles geeignet ist, was DOM-Zugriff erfordert, aber eine AJAX-Anfrage benötigt dies nicht unbedingt oder normalerweise.
Was gibt?
Der Titel sagt alles. Ich verstehe, warum dies componentDidMountfür alles geeignet ist, was DOM-Zugriff erfordert, aber eine AJAX-Anfrage benötigt dies nicht unbedingt oder normalerweise.
Was gibt?
Antworten:
componentDidMountist für Nebenwirkungen. Hinzufügen von Ereignis-Listenern, AJAX, Mutieren des DOM usw.
componentWillMountist selten nützlich; Besonders wenn Sie sich für das serverseitige Rendern interessieren (das Hinzufügen von Ereignis-Listenern führt zu Fehlern und Lecks sowie zu vielen anderen Dingen, die schief gehen können).
Es wird über das Entfernen componentWillMountvon Klassenkomponenten gesprochen, da dies demselben Zweck dient wie der Konstruktor. Es bleibt auf createClassKomponenten.
componentWillMount? Ich sehe den Unterschied nicht wirklich.
componentWillMountbefindet, auf einem serverseitigen Render ausgeführt wird. Wenn Sie dagegen verwenden componentDidMount, wird dies nur auf der Clientseite ausgeführt. Daher componentWillMountist es keine gute Idee , Dinge einzubringen , die externe Interaktionen ausführen oder an Ereignisse usw. binden. Wenn Sie nicht vorhaben, Ihre Komponenten auf dem Server zu rendern, ist dies immer noch keine gute Idee, nur um eine mögliche Code-Portabilität zu gewährleisten. Dies ist alles außerhalb des Hauptgrundes, warum es schlecht ist, was in @daniulas Antwort erklärt wird.
Ich hatte das gleiche Problem auch am Anfang. Ich habe mich entschlossen, Anfragen zu stellen, componentWillMountaber es kommt zu verschiedenen kleinen Problemen.
Ich habe das Rendern ausgelöst, als der Ajax-Aufruf mit neuen Daten beendet wurde. Irgendwann dauerte das Rendern der Komponente länger als das Abrufen einer Antwort vom Server, und zu diesem Zeitpunkt löste der Ajax-Rückruf das Rendern einer nicht gemounteten Komponente aus. Dies ist eine Art Randfall, aber es gibt wahrscheinlich noch mehr, daher ist es sicherer, sich daran zu halten componentDidMount.
componentWillMount, daher sollten Sie ihn weiterhin componentDidMountfür Ihre Ajax-Aufrufe verwenden.
setStateeinen Komponentenkonstruktor aufrufen und können nicht bestimmen, wann der AJAX-Aufruf abgeschlossen wird. twitter.com/dan_abramov/status/576453138598723585
Laut Dokumentationseinstellung componentWillMountlöst der Status in kein erneutes Rendern aus. Wenn der AJAX-Aufruf nicht blockiert wird und Sie einen zurückgeben Promise, der den Status der Komponente bei Erfolg aktualisiert, besteht die Möglichkeit, dass die Antwort eintrifft, sobald die Komponente gerendert wurde. Da componentWillMountkein erneutes Rendern ausgelöst wird, haben Sie nicht das erwartete Verhalten, dh die Komponente, die mit den angeforderten Daten gerendert wird.
Wenn Sie eine der Flussbibliotheken verwenden und die angeforderten Daten in dem Speicher landen, mit dem die Komponente verbunden ist (oder von einer verbundenen Komponente erbt), ist dies kein Problem, da der Empfang dieser Daten höchstwahrscheinlich die Requisiten ändert schließlich.
componentWillMountlöst kein erneutes Rendern aus, nur weil vor dem ersten Rendern ein neuer Status definiert wurde. Wenn setStatees jedoch in einem AJAX-Rückruf aufgerufen wird, wird es definitiv nach dem ersten Rendern aufgerufen und löst ein erneutes Rendern aus.
componentWillMountwürde dies fehlschlagen, da die Komponente ... nicht gemountet wurde.