vida son react qué que props podemos optimizar método los español entre desmontar con comunicacion componentes componente ciclo javascript reactjs

javascript - son - ¿Por qué las solicitudes asíncronas se deben realizar en componentDidMount en lugar de getInitialState en ReactJS?



react js (2)

No querría hacer esto porque su componente estará esperando en la solicitud asíncrona y no podrá montar hasta que finalice. Si tiene html con un par de variables de estado, deje que reaccione primero en lugar de hacerlo esperar. Sé que esto es una opinión, pero también es una cuestión de separación de preocupaciones.

This página de los documentos de React muestra que los datos solicitados asíncronos se deben consumir en el evento componentDidMount , mientras que getInitialState inicializa el objeto de estado a un estado vacío predeterminado.

¿Hay alguna razón para eso? ¿Quizás no se espera que getInitialState haga esto o tenga un propósito diferente? ¿Se debe a alguna lógica interna de la biblioteca?

Nota para los moderadores y respondedores: esta no es una pregunta basada en la opinión: si existe una razón, esa sería la respuesta, sin embargo, una buena y correcta respuesta a mi pregunta también podría ser "No, no hay ninguna particular Razon, haz lo que sientas mejor ".


getInitialState debe ser una función pura de los accesorios (aunque a menudo no se utilizan). En otras palabras, con las mismas propiedades, getInitialState debe devolver los mismos datos.

Se permite que componentDidMount tenga un comportamiento dinámico y cause efectos secundarios como la manipulación de dom y las solicitudes de ajax (esa es la intención principal de esto).

Una forma común de manejar esto es con un retorno temprano de un div vacío, mensaje de carga, <div>Loading</div> ), o indicador de carga (por ejemplo, spinkit ).

En el primer renderizado se mostrará el spinner, y luego el estado se actualizará con los datos y se podrá ejecutar la parte principal del render.

render: function(){ // while loading if (!this.state.data){ return <div className="spinner"></div> } // loaded, you can use this.state.data here return <div>...</div> }