Perché i documenti di React consigliano di eseguire AJAX in componentDidMount, non in componentWillMount?

Il titolo dice tutto. Capisco perché componentDidMount è appropriato per tutto ciò che richiede l’accesso DOM, ma una richiesta AJAX non necessariamente o di solito ha bisogno di questo.

Cosa dà?

componentDidMount è per effetti collaterali. Aggiunta di listener di eventi, AJAX, muting del DOM, ecc.

componentWillMount è raramente utile; specialmente se ti interessa il rendering lato server (l’aggiunta di listener di eventi causa errori e perdite e molte altre cose che possono andare storte).

Si parla della rimozione di componentWillMount dai componentWillMount della class poiché serve allo stesso scopo del costruttore. Rimarrà sui componenti createClass .

Ho avuto lo stesso problema anche all’inizio. Ho deciso di fare un tentativo di fare richieste in componentWillMount ma finisce in vari piccoli problemi.

Stavo triggersndo il rendering quando la chiamata ajax terminava con nuovi dati. A un certo punto, il rendering del componente richiedeva più tempo di ottenere la risposta dal server ea questo punto la callback ajax stava triggersndo il rendering sul componente non montato. Questo è un tipo di edge case, ma probabilmente c’è di più, quindi è più sicuro attenersi a componentDidMount .

Secondo la documentazione l’impostazione dello stato in componentWillMount non innescherà un re-rendering. Se la chiamata AJAX non sta bloccando e si restituisce una Promise che aggiorna lo stato del componente in caso di successo, ci sono possibilità che la risposta arrivi una volta che il componente è stato reso. Poiché componentWillMount non triggers il re-rendering, non si avrà il comportamento previsto, che è il componente sottoposto a rendering con i dati richiesti.

Se si utilizza una delle librerie di stream e i dati richiesti finiscono nello store, il componente è connesso (o ereditato da un componente connesso) questo non sarà un problema in quanto la ricezione di tali dati, molto probabilmente, cambierà gli oggetti di scena infine.