Я пишу методы выборки с несколькими возможными состояниями, как это, работает в любой ситуации без ошибок.
Общая идея, стоящая за этим: вы проверяете все возможные состояния, но если ни одно не совпадает, возвращаете состояние загрузки.
fetchMovieResults() {
const {assets} = this.props;
if (assets) {
if (assets.fetchResultsError) {
// if error
return (
<div className="loading">
<h1>{assets.fetchResultsError}</h1>
</div>
);
} else if (assets.SearchResult && assets.SearchResult.Search && assets.SearchResult.Search.length > 0) {
// if data and more than 0
return assets.SearchResult.Search.map(series => (
<div className="latest" key={series._id}>
<h1>{series.title}</h1>
</div>
));
}
}
// no error or data
// has to be loading
return (
<div className="loading">
<h1>Loading...</h1>
</div>
);
}
Редактировать
Почему мой код работает, а ваш - нет?
(Это предположение, потому что я не знаю весь ваш код)
componentDidMount
запускается после того, как компонент монтируется и отображается в первый раз, что означает, что ваш код fetch API запускается после того, как компонент уже отображается в первый раз (что является хорошей практикой).
Это означает, что ваше действие выполняется, и редуктор добавляет loadingResults
состояние ПОСЛЕ первого рендера, что означает:
if (this.props.assets.fetchResultsError) {
// this check fails
} else if (this.props.assets.loadingResults) {
// this check fails
} else {
// this code runs but you don't have
// data yet and you'll get an error
}
Мой ответ работает в любой ситуации, потому чтосостояние "загрузка" является параметром по умолчанию.