Ответы пользователя по тегу Redux
  • Как обработать ошибку от createAsyncThunk в Redux toolkit?

    @slide13
    frontend/web-developer
    Вопрос: почему после запроса в блоке try
    await dispatch(fetchOrderCreate({...formData, type: 'pickup'}));
    Выполнение кода продолжается как ни в чем не бывало, и не попадает в блок catch.


    Потому что, если почитать документацию, то там будет написано, что createAsyncThunk всегда возвращает resolved промис, даже при ошибке. А чтобы возвращалась оригинальная ошибка нужно дополнительно вызвать unwrap:

    await dispatch(fetchOrderCreate({...formData, type: 'pickup'})).unwrap();
    Ответ написан
  • Как исправить баг соприкосновения двух Slice в RTK?

    @slide13
    frontend/web-developer
    Потому что кое что забыли в addMatcher. Сейчас у вас оба слайса в extraReducers матчатся на все асинхронно возвращаемые через промисы экшены, поэтому данные и записываются в оба слайса Т.е. вам необходимо матчить по название thunk + статус, а не только по статусу, как пример, для option:
    вот вы создали async thunk с типом "countries/fetchCountries"
    export const fetchCountries = createAsyncThunk(
      'countries/fetchCountries',
    ...

    и в addMatcher будет тогда:
    (action) => action.type.endsWith("countries/fetchCountries/pending"),

    Ну и везде так поменяйте.
    Ответ написан
    1 комментарий
  • Почему возникает ошибка Cannot perform 'get' on a proxy that has been revoked?

    @slide13
    frontend/web-developer
    Потому что в редюсере не нужно писать асинхронный код и вызывать сайд эффекты.
    А ошибку эту выводит immer, потому что вы сетите асинхронно стейт, когда сама функция редюсер уже завершилась
    Ответ написан
  • Почему стейт мутирует?

    @slide13
    frontend/web-developer
    Павел Орловский вы же сами в стейт записываете результат метода slice:
    state.items = state.items.slice(
            action.payload.leftBoundPage,
            action.payload.rightBoundPage
          );

    Тут slice первый раз возвращает новый массив из items от индекса leftBoundPage (0) до rightBoundPage (5, не включая его), т.е. из 10 изначальных элементов остаются первые 5 и вы перезаписываете этими элементами старые items.

    Здесь вам надо не менять items, а написать селектор, который будет возвращать часть items на основании leftBoundPage и rightBoundPage
    Ответ написан
    Комментировать
  • Как исправить 401 (Unauthorized)?

    @slide13
    frontend/web-developer
    Подозреваю, что ваш сервер не отдает 200 на preflight запрос OPTIONS, в итоге с браузера возвращается 401. В postman же все работает, т.к. это фича только браузера и postman не отправляет OPTIONS перед POST запросом.
    Если используется nodejs на сервере, то необходимо включить preflight запросы на нужные маршруты, либо для всех, например, можно сделать так:
    app.use(cors({ credentials: true, origin: true }))

    или разрешить для всех маршрутов через опции:
    app.options('*', cors())

    Почитать про preflight в express тут
    Ответ написан
  • Почему после dispatch не обновляется state на хуках?

    @slide13
    frontend/web-developer
    Опечатка - у вас передается payOlad, а данные в редюсере берутся из action.payload. Рекомендую поставить плагины, типа code spell checker, очень помогает.
    Ответ написан
    4 комментария