#javascript #reactjs #asynchronous #es6-promise
#язык JavaScript #реагирует на #асинхронный #es6-обещание
Вопрос:
Я хочу показать сообщение «вычисление…» во время синхронного вычисления hevy в методе компонента React.
Вот мой код.
Но это не работает. Я хочу, чтобы реакция вызывала render() как после первого, так и после второго состояния.
Но React вызывает его только после второго заданного состояния.
Как я могу this.state.calculating
правильно переключиться?
// note: this is not async function function myHeavyFunc() {...} class Foo extends React.Components { constructor(props) { super(props); this.state = {calculating: false} this.handleXX = this.handleXX.bind(this); } handleXX() { this.setState({calculating: true}, () =gt; { // first setState new Promise((resolve, reject) =gt; { const x = myHeavyFunc(); resolve(x); }).then(x =gt; { this.setState({calculating: false}); // second setState }); }); } render() { const y = this.state.calculating? lt;pgt;calculating...lt;/pgt; : ''; return ( lt;divgt; {y} lt;button onClick={this.handleXX}gt;start calclt;/buttongt; lt;/divgt; ); } }
Комментарии:
1. Похоже, вам захочется разделить их. Запустите первое заданное состояние, при рендеринге, если вычисление === true, запустите свою функцию.
2. спасибо за комментарий, но это не работает… Похоже, что, несмотря на то, что функция render() вызывается правильно, применение результата рендеринга к dom блокируется выполнением myHeavyFunc. Я замечаю это, пытаясь использовать componentDidUpdate(). Он вызывается после render(), но применяется к реальному dom блокируется…
3. в функциональном компоненте это будет обрабатываться эффектом использования с массивом зависимостей. Функция componentDidUpdate() срабатывает до рисования, поэтому она по-прежнему блокирует dom…
Ответ №1:
После завершения расчета вы должны вернуть переменной состояния «вычисление» значение «false» вместо «true».:
handleXX() { this.setState({calculating: true}, () =gt; { // first setState new Promise((resolve, reject) =gt; { const x = myHeavyFunc(); resolve(x); }).then(x =gt; { this.setState({calculating: false}); // second setState }); }); }
Комментарии:
1. извините. это опечатка. в моем исходном коде это
false