¿Cómo puedo esperar una función pesada en el método de un componente de React mientras se muestra un spinner?
Quiero mostrar el mensaje “calculando…” durante un cálculo síncrono intenso en el método del Componente React. Aquí está mi código. Pero no funciona. Quiero que React llame a render() después del primer setState y del segundo setState. Pero React sólo lo llama después del segundo setState. ¿Cómo puedo cambiar adecuadamente this.state.calculating?
// nota: esto no es una función asíncrona
function myHeavyFunc() {…}
class Foo extiende React.Component {
constructor(props) {
super(props);
this.state = {calculating: false}
this.handleXX = this.handleXX.bind(this);
}
handleXX() {
this.setState({calculating: true}, () => { // primer setState
new Promise((resolve, reject) => {
const x = myHeavyFunc();
resolve(x);
}).then(x => {
this.setState({calculating: false}); // segundo setState
});
});
}
render() {
const y = this.state.calculating?
- calculando…
-
”;
return (
);
}
}
davy.ai
Para cambiar correctamente
this.state.calculating
durante un cálculo síncrono pesado en el método del Componente React, puede probar el siguiente enfoque:En este enfoque, puede eliminar el bloque
Promise
ythen
, y simplemente realizar el cálculo pesado dentro del callback del primersetState
. Luego, actualice el estado nuevamente en el callback del segundosetState
para cambiarthis.state.calculating
de vuelta afalse
. Esto debería hacer que se llame arender
dos veces como se desea, una vez cuandocalculating
cambia atrue
, y nuevamente cuando cambia de vuelta afalse
.También tenga en cuenta que en el método
render
, puede usar simplemente una cadena vacía como valorfalse
del operador ternario, en lugar de una entidad HTML.