У меня есть следующий код, который является компонентом реакции, который рендерит огромный компонент. Пока огромный компонент не закончил рендеринг, отображается индикатор загрузки.
import * as React from "react";
import ReactDOM from "react-dom";
import {HUGEComponent} from "./huge.tsx";
class App extends React.Component<{}, {loading: boolean}> {
constructor(props: {}) {
super(props);
this.state = {loading: true};
}
componentDidMount() {
setTimeout(() => this.setState({loading: false}), 0);
}
render() {
return this.state.loading ? <p>Loading...</p> : <HUGEComponent />;
}
}
ReactDOM.render(<App />, document.getElementById("root"));
Функция setTimeout
внутри componentDidMount
гарантирует, что обновление состояния происходит только после загрузки HUGEComponent
(я использовал 10000 абзацев lorem ipsum как HUGEComponent
). Без setTimeout
состояние обновляется немедленно, а индикатор загрузки не отображается.
Итак, мой вопрос: почему это работает с setTimeout
? Я знаю, что он отправляет обновление состояния в очередь сообщений, которая, следовательно, будет выполняться после того, как все остальное было сделано. Но поскольку используется троичный оператор (отложенная оценка), фактический рендеринг HUGEComponent
должен подождать, пока состояние не будет обновлено, так что обновление состояния происходит перед его рендерингом, но, похоже, это не так. Состояние на самом деле не обновляется, пока <HUGEComponent />
не было оценено. Так почему <HUGEComponent />
оценивается до обновления состояния, несмотря на ленивую оценку в троичном операторе?