2016-07-04 16 views
6

La documentazione di React indica che la richiesta di ajax deve essere avviata dall'evento componentDidMount ciclo di vita (vedere react docs).Perché la richiesta di ajax deve essere eseguita in componentDidMount nei componenti React?

Perché questo evento?

Nella maggior parte dei casi, quando si carica dati utilizzando ajax, voglio visualizzare un qualche tipo di barra di caricamento, ad esempio:

componentDidMount() { 
    this.setState({isLoading: true}); 
    fetch(...) 
     .then(...) 
     .then(() => this.setState({isLoading: false}) 
} 

ma questo spara render metodo 3 volte (iniziale renda immediatelly seguiti modificando isLoading = true e poi da isLoading = false

Cosa c'è che non va circa l'invio di richiesta AJAX da componentWillMount evento?

+0

Possibile duplicato di [Perché i documenti di React consigliano di eseguire AJAX in componentDidMount, non componentWillMount?] (Http://stackoverflow.com/questions/27139366/why-do-the-react-docs-recommend-doing-ajax -in-componentdidmount-not-componentwi) – mattias

risposta

3

Beh, isLoading: true potrebbe essere parte dello stato iniziale, non c'è bisogno per impostarlo dopo componente ha fatto montare => solo 2 rendering, non 3.

Secondo https://github.com/reactjs/react-redux/issues/210, conseguenza di rimettere render solo una volta da componentWillMount significa che se setState saranno chiamati in modo asincrono dopo render, non avrà alcun effetto (se capisco correttamente i commenti).

Non so se c'è la possibilità che la richiamata con setState può eseguire prima render e quindi non schermata di caricamento sarà visibile, solo i risultati, quindi a volte sarebbe "lavoro" (molto probabilmente in DEV), ma in realtà sarebbe una condizione di competizione molto difficile da eseguire il debug ...

vedi anche https://facebook.github.io/react/tips/initial-ajax.html

+0

il problema è stato risolto, quindi setState chiamato da componentWillMount avrà effetto prima del rendering. nei documenti di risposta non vi è ancora alcuna spiegazione sul perché le chiamate ajax debbano essere fatte in componentDidMount – Liero

+0

bene, non si sta chiamando 'setState' da componentWillMount né componentDidMount direttamente, ma da un nuovo stack asincrono. Non ho idea di come esattamente la reazione sia implementata per mantenere il riferimento a "questo" con gli ascoltatori di eventi dal vivo con vari metodi. se usare funzionalità non documentate non è abbastanza spaventoso per te e vuoi un po 'di eccitazione che potrebbe funzionare e forse anche nelle versioni future, quindi sentiti libero, non so se si romperà o no – Aprillion

0

Point è lasciate che il vostro reagiscono componente rendering con lo stato iniziale in modo che si vedrà la barra di caricamento (caricamento: true).

È possibile spostare la riga: this.setState ({isLoading: true}) in componentWillMount(). Poiché lo stato di impostazione in componentWillMount non attiva un rerender del componente. Il metodo di rendering riceverà il componente aggiornato.

+0

Ma ho bisogno di ottime ragioni per split 'this.setState ({isLoading: true})' e una chiamata ajax in due eventi del ciclo di vita. Non so ancora perché la chiamata ajax dovrebbe essere fatta in componentDidMount piuttosto che componentWillMount – Liero