Цикл запроса происходит потому, что компонент DataList
перерисовывается, вызывая ComponentDidMount
, который вызывает getData()
после каждого рендеринга.
Компонент рендерится, если есть изменение в реквизитах или состоянии компонента.
getData()
устанавливает свойство состояния requestStatus
(именно поэтому все ваше приложение перерисовывается), которое является опорой DataList
- вызывая перерисовку DataList
.
Вы не должны использовать requestStatus
в качестве опоры DataList
, поскольку вы все равно получаете это из контекста.
Это может быть связано с тем, что функция уровня вашего провайдера (dataContextProvider
) getData
имеет то же пространство имен, что и ваша функция, которую вы импортируете из ../Api
.
И затем я считаю, что когда следующая строка const data = await getData();
выполняется в блоке кода ниже, она на самом деле вызывает функцию провайдеров getData
, вызывая тем самым цикл.
async getData() {
this.setState({ requestStatus: RequestStatus.RUNNING });
try {
const data = await getData();
this.setState({ data, requestStatus: RequestStatus.INACTIVE });
} catch (error) {
this.setState({ requestStatus: RequestStatus.FAILED });
}
}
Хорошо, после попытки воспроизвести проблему в песочнице, я понял, в чем проблема: я обернул родительский компонент в HOC внутри функции рендеринга, например так:
<Route exact path="/datapage" component={requireLoggedInUser(Page)} />
, который вызвал DataList
компонент должен быть уничтожен + воссоздан каждый раз, когда приложение перерисовывается.