Лучшая практика для обработки ошибок в Redux и React

у меня есть асинхронная функция в моих действиях redux, и она возвращает такой объект в моем редукторе:

{
user: {},
fetching: false,
fetched, false,
error: null
}

поэтому в основном, когда я начинаю вызывать асинхронную функцию, я обновляю состояние redux до fetching: true и если результат успешно выполнен, то fetched:true и fetching:false
Поэтому я сопоставляю состояние redux с реквизитом, используя connect в react-redux, и я добавил Это в функцию рендеринга моего компонента:

if(this.props.fetched) {
  // Go to next page
}

и он автоматически переходит к следующему страница после извлечения данных.
Однако у меня есть проблема с обработкой ошибок. Когда ошибка изменяется от null до error, как мне обрабатывать обработку ошибок в моем компоненте react. Что у меня есть это:

if(this.props.error != null) {
   // popup error
} 

но теперь я оказываюсь в ситуации, когда в следующий раз я назову свое действие, у него уже есть это.реквизит.ошибка, назначенная ошибке, и ее NOT null, что приводит к отображению всплывающего окна, даже если ошибки нет.
Должен ли я сбрасывать свою ошибку каждый раз, когда это отображается или есть какая-то лучшая практика делать все это?

2 ответов


можно использовать redux-catch middleware для захвата ошибок для Redux редукторов и промежуточных программ.

Вы можете использовать что-то вроде

import reduxCatch from 'redux-catch';

function errorHandler(error, getState, lastAction, dispatch) {
    //dispatch ERROR action as you need.
}

const store = createStore(reducer, applyMiddleware(
  reduxCatch(errorHandler)
));

и отобразите всплывающее окно ошибки, когда вы получите действие ошибки, которое запускается из redux-catch промежуточное. Когда вы закрываете всплывающее окно, отправьте действие, которое сбрасывает ошибку до null, чтобы всплывающее окно не отображалось, если нет ошибок для отображения.


У меня была аналогичная проблема, когда у меня был модальный продолжать отображать старые ошибки после закрытия модального. Я решил это, отправив действие "resetErrors" после того, как я получил успех через свой обратный вызов.

Я не сталкивался с лучшим решением, кроме "сброса" его каждый раз.