example componentwillmount componentdidmount javascript class reactjs constructor ecmascript-6

javascript - componentdidmount - componentwillmount example



constructor vs componentWillMount; ¿Qué componente puede hacerWillMount que un constructor no puede? (1)

¿Esto significa, dentro de componentWillMount, si llamamos a setState en una devolución de llamada de método asíncrono (puede ser una devolución de llamada de promesa), React bloquea la representación inicial hasta que se ejecuta la devolución de llamada?

No, mira here .

El siguiente código no bloquea el procesamiento (tenga en cuenta que esto sería un patrón anti de todos modos para llamar a setState allí)

componentWillMount: function() { new Promise((resolve, reject) => { setTimeout(()=> { resolve(); }, 2000) }).then(() => this.setState({ promiseResult: ''World'' })); },

Pregunta 2: ¿Hay algún otro caso de uso que pueda lograr con componentWillMount solamente, pero sin usar el constructor y componentDidMount?

No, para las clases de ES6 puedes descartar componentWillMount . Solo es necesario si usa React.createClass({... })

EDITAR: Aparentemente, estoy equivocado. Gracias a @ Swapnil por señalar esto. Aquí está la discussion .

React arroja una advertencia si hay un efecto secundario en el constructor que modifica el estado en otro componente, porque asume que se establece setState en el propio constructor y potencialmente durante el proceso de render() . Entonces no se desean efectos secundarios en el constructor .

Este no es el caso si lo hace en componentWillMount , no se generan errores. Por otro lado, los chicos de Facebook desalientan los efectos secundarios en el componentWillMount también. Entonces, si no tiene ningún efecto secundario, podría usar el constructor lugar de componentWillMount . Para los efectos secundarios, se recomienda utilizar componentDidMount lugar de componentWillMount . De cualquier manera, no necesita componentWillMount .

Por lo que pude ver, lo único que un componentWillMount puede hacer y un constructor no puede es llamar a setState .

componentWillMount() { setState({ isLoaded: false }); }

Como todavía no hemos llamado render , un setState en componentWillMount preparará el objeto de estado antes de que setState el primer pase de render() . Que es esencialmente lo mismo que hace un constructor :

constructor(props) { super(props); this.state = { isLoaded: false }; }

Pero veo otro caso de uso donde componentWillMount es útil (en el lado del servidor).

Consideremos algo asincrónico:

componentWillMount() { myAsyncMethod(params, (result) => { this.setState({ data: result }); }) }

Aquí no podemos usar el constructor como asignación a this.state . this.state no activará render() .

¿Qué pasa con setState en componentWillMount ? De acuerdo con los documentos React :

componentWillMount() se invoca inmediatamente antes de que se produzca el montaje. Se llama before render( ), por lo tanto, establecer el estado en este método no desencadenará una nueva representación. Evite introducir efectos secundarios o suscripciones en este método.

Por lo tanto, creo que React usará el nuevo valor de estado para la primera representación y evitará una nueva representación.

Pregunta 1: ¿Esto significa, dentro de componentWillMount , si llamamos a setState en una devolución de llamada de método asíncrono (puede ser una devolución de llamada de promesa), React bloquea la representación inicial hasta que se ejecuta la devolución de llamada?

Teniendo esta configuración en el lado del cliente (sí, veo ese caso de uso en la representación del lado del servidor), si supongo que lo anterior es cierto, no veré nada hasta que se complete mi método asincrónico.

¿Me estoy perdiendo algún concepto?

Pregunta 2: ¿Hay algún otro caso de uso que pueda lograr con componentWillMount solamente, pero sin usar el constructor y componentDidMount ?