У меня есть один редуктор для клиентов, другой для AppToolbar и некоторые другие ...
Теперь допустим, что я создал действие выборки для удаления клиента, и если это не удается, у меня есть код в редукторе клиентов, который должен кое-что делать, но также я хочу отобразить некоторую глобальную ошибку в AppToolbar.
Но редукторы Clients и AppToolbar не используют одну и ту же часть состояния, и я не могу создать новое действие в редукторе.
Так как же мне показать глобальную ошибку? Спасибо
ОБНОВЛЕНИЕ 1:
Я забыл упомянуть, что использую este devstack
ОБНОВЛЕНИЕ 2: Я отметил ответ Эрика как правильный, но я должен сказать, что решение, которое я использую, больше похоже на комбинацию ответов Эрика и Дэна ... Вам просто нужно найти то, что вам больше всего подходит в вашем коде .. .
источник
Ответы:
Если вы хотите иметь концепцию «глобальных ошибок», вы можете создать
errors
редуктор, который может прослушивать действия addError, removeError и т. Д. Затем вы можете подключиться к своему дереву состояний Reduxstate.errors
и отображать их там, где это необходимо.Есть несколько способов подойти к этому, но общая идея состоит в том, что глобальные ошибки / сообщения заслуживают того, чтобы их собственный редуктор существовал полностью отдельно от
<Clients />
/<AppToolbar />
. Конечно, если любому из этих компонентов нужен доступ,errors
вы можете передатьerrors
его в качестве опоры везде, где это необходимо.Обновление: пример кода
Вот один пример того, как это могло бы выглядеть, если бы вы передали "глобальные ошибки"
errors
на свой верхний уровень<App />
и условно отрендерили их (если есть ошибки). Использование response-reduxconnect
для подключения вашего<App />
компонента к некоторым данным.И что касается создателя действия, он отправит ( redux-thunk ) успешную неудачу в соответствии с ответом
Хотя ваш редуктор может просто управлять массивом ошибок, соответствующим образом добавляя / удаляя записи.
источник
catch
функции, еслиsomeHttpClient.get('/resources')
илиfetch('/resources')
которые я использую в своем возврате кода500 Server Error
. Есть ли у вас какие-то мысли, в которых я мог бы ошибиться? По сути, яfetch
отправляю запрос, который заканчивается моим, вroutes
котором я вызываю метод своейmongoose
модели для выполнения чего-то очень простого, например, добавления текста или удаления текста из БД.Ответ Эрика правильный, но я хотел бы добавить, что вам не нужно запускать отдельные действия для добавления ошибок. Альтернативный подход - иметь редуктор, который обрабатывает любое действие с
error
полем . Это вопрос личного выбора и условности.Например, из примера Redux, в
real-world
котором есть обработка ошибок:источник
error
к действию. Спасибо, Дэн!Подход, который я сейчас использую для нескольких конкретных ошибок (проверка пользовательского ввода), заключается в том, чтобы мои суб-редукторы генерировали исключение, перехватывали его в моем корневом редукторе и прикрепляли к объекту действия. Затем у меня есть redux-saga, которая проверяет объекты действий на наличие ошибок и в этом случае обновляет дерево состояний с данными об ошибках.
Так:
А затем добавление ошибки в дерево состояний, как описывает Эрик.
Я использую его довольно экономно, но он избавляет меня от необходимости дублировать логику, которая законно принадлежит редуктору (чтобы он мог защитить себя от недопустимого состояния).
источник
напишите собственное промежуточное ПО для обработки всех ошибок, связанных с api. В этом случае ваш код будет чище.
источник
if
в редукторечто я делаю, так это централизую всю обработку ошибок в эффекте для каждого эффекта
источник
Вы можете использовать HTTP-клиент axios. Он уже реализовал функцию перехватчиков. Вы можете перехватывать запросы или ответы до того, как они будут обработаны к тому времени или пойманы.
https://github.com/mzabriskie/axios#interceptors
источник