Состояние заблокированного пользовательского интерфейса / Отображение анимации загрузки в React
Я хочу показать загрузочную анимацию, пока выполняю некоторую обработку данных, которые хранятся в состоянии компонентов. Логическая переменная загрузки управляет показом анимации загрузки или нет. Это работает, когда я делаю асинхронный запрос AJAX. Однако, когда я пытаюсь изменить состояние загрузчика в компонентном методе, это не работает. Я пытался избежать блокировки интерфейса с небольшим таймаутом (см. Комментарий в коде), но безрезультатно.
Как показать анимацию загрузки при запуске вычислений и затем снова скрыть ее?
calculateMovements() {
// show the loading animation
this.setState({
loading: true
});
let data = this.state.data;
// ...do expensive calculations on data here...
// avoid blocking UI
setTimeout(function() {
// redraw with updated data
this.setState({
data,
loading: false
});
}.bind(this), 10);
},
render() {
return (
<MuiThemeProvider>
<div id="wrap">
<Loader
visible={this.state.loading}
/>
// etc. ...
2 ответа
Для тяжелых расчетов в браузерах, вам действительно нужно подумать об использовании рабочих. Работники работают в фоновом режиме, и они предназначены, чтобы не блокировать пользовательский интерфейс,
При вызове setTimeOut вы фактически передаете результат setState
в setTimeOut
, Сделать setTimeOut
как это...
calculateMovements() {
this.setState({ loading: true});
setTimeout(function() {
// ...do expensive calculations on data here...
this.setState({
data: data,
loading: false
});
}.bind(this), 10);
}
Тогда это будет работать нормально.