Я уверен, что я делаю что-то глупое здесь. Я пытаюсь написать компонент, который, основываясь на состоянии извлечения данных, отображает одну из трех вещей.
1) Сообщение об ошибке, если при выборке произошла ошибка.
2) Сообщение о загрузке, если данные выбираются.
3) Полный дочерний компонент, если данные извлекаются.
То, что происходит сейчас, - это получение успешно, но сообщение Загрузка не исчезнет. В приведенном ниже примере кода вы можете видеть, что я добавил console.log для определения того, должен ли происходить полный рендеринг. Что меня смущает, так это то, что будет в конечном итоге записываться как true, но сообщение о загрузке по-прежнему отображается.
Этот точный шаблон, кажется, работает для одноуровневого компонента в этом приложении, поэтому я не понимаю, чего здесь не хватает ... Вот весь компонент, он был анонимным и лишен стилей, но в остальном структура идентична.
function mapStateToProps(state) {
return {
Data: state.NewDataReducer,
};
}
const mapDispatchToProps = {
fetchNewData: ActionCreators.fetchNewData,
};
const DataError = () => (
<div>
Error fetching new data!
</div>
);
const DataLoading = () => (
<div>
Loading..
</div>
);
class MainContainer extends PureComponent {
static propTypes = {
choice: PropTypes.string,
fetchNewData: PropTypes.func,
Data: ImmutablePropTypes.map.isRequired,
}
state = {
choice: null,
}
componentDidUpdate(nextProps) {
const { choice, fetchNewData, Data } = this.props;
if(!choice) {
return;
}
if(isFetching(Data)) {
return;
}
const newChoiceSelected = choice !== nextProps.choice;
if(newChoiceSelected) {
fetchNewData({choice});
}
}
handleChangeChoice = (choice) => {
this.setState({
choice: { choice }
});
}
render() {
const { choice, Data } = this.props;
const error = hasFetchError(Data);
const loading = !error && !isFetched(Data);
const renderFull = !loading && !error;
console.log(renderFull);
if(!renderFull) {
return (
<div>
Please wait.
</div>
);
}
const { dataBreakdown } = Data.get("dataKey").toJS();
return (
<div>
<ChildComponent
choice={choice}
dataBreakdown={dataBreakdown}
onSetDrillDown={this.handleChangeChoice}
/>
</div>
);
}
}
export default connect(
mapStateToProps,
mapDispatchToProps,
)(MainContainer);