Когда возникает ошибка тайм-аута при получении данных из API для рендеринга на странице React с поддержкой MobX, я вижу результаты последнего успешного запроса, отображаемого вместо нужных данных (или пустых данных). В частности, следующие шаги:
- Введите страницу, для которой требуется идентификатор элемента для получения результатов из базы данных и поместит результаты запроса в состояние для отображения.
- Вернитесь, введите ту же страницус новым идентификатором этот запрос истекает. Вместо того, чтобы видеть ничего или ошибку, я вижу результаты шага 1, то есть неправильные данные элемента.
Это происходит по всему сайту, и мне нужно исправить, которое я могу внедрить везде. Ниже приведен код, который я написал для решения проблемы на одной странице, но этот шаблон необходимо будет скопировать в каждый магазин нашего приложения. Я не уверен, что это правильное решение, потому что оно работает, отслеживая идентификатор элемента и удаляя все наблюдаемые при изменении - это похоже на то, что MobX должен делать, поэтому я боюсь, что мое решение - это анти-шаблон.
Есть ли лучшее решение этой проблемы, чем представленное ниже?
class SupplierUtilizationStore {
@observable key = 0; //supplierId
utilizationSearchStore = new SearchStateStore();
@observable utilizationSearchResults = [];
@observable selectedChartType = 'ByMonth';
@observable supplierUsageForChart = {};
@observable utilizationSummaryData = {};
constructor(rootStore, dataLayer) {
this.rootStore = rootStore;
rootStore.supplierStore = this;
this.db = dataLayer;
this.initUtilizationSearchStore();
}
initUtilizationSearchStore() {
this.utilizationSearchStore.searchResultsTotalUnitCost = observable({});
this.utilizationSearchStore.searchResultsTotalCost = observable({});
this.utilizationSearchStore.searchResultsTotalQty = observable({});
this.utilizationSearchStore.supplierId = observable({});
}
//Call this in componentDidMount()
@action
initStore(key) {
if (key !== this.key) {
this.utilizationSearchStore = new SearchStateStore();
this.initUtilizationSearchStore();
this.utilizationSearchResults = [];
this.selectedChartType = 'ByMonth';
this.supplierUsageForChart = {};
this.utilizationSummaryData = {};
this.utilizationSearchStore.supplierId = key;
this.key = key;
}
}
...
}