Перенаправление не перенаправляет на домашнюю страницу, вместо этого перенаправляет на страницу настройки с помощью redux

#reactjs #redux #react-router

Вопрос:

Я хочу перенаправить домашнюю страницу на страницу настройки после завершения действия redux. App.js Код-это

 const companyDetails = useSelector((state) => state.companyDetails);
const { loading, error, company } = companyDetails;
useEffect(() => {
  if (!company) {
    dispatch(detailsCompany());
  }
}, [dispatch, company]);
return loading ? (
  <LoadingBox></LoadingBox>
  ) : error ? (
  <MessageBox variant="success">{error}</MessageBox>
  ) : (
  ...otherRoutes
   <Route path="/" exact>
      {company ? (
        userInfo?.isAdmin ? (
          <DashboardScreen />
        ) : (
          <HomeScreen />
        )
      ) : (
        <Redirect to="/setup" />
      )}
    </Route>
)
 

После завершения действия redux переменная компании имеет значение, но она перенаправляется на страницу настройки вместо домашней страницы или панели мониторинга.

Комментарии:

1. Является ли функция detailsCompany() написанной с использованием redux-thunk?

2. ДА. Redux-thunk используется для записи подробной информации о компании()

Ответ №1:

Компонент на начальном рендеринге не имеет определенного поля компании. Таким образом, это приведет к пути кода, который выполняет перенаправление еще до того, как будут получены сведения о компании.

Даже если информация о компании завершена, страница уже перенаправлена.Одним из способов справиться с этим является

Предполагая, что это что detailsCompany() -то вроде этого

 function detailsCompany(){
  return dispatch=>{
    return someApi.getCompanyDetails().then(()=>{//do something})
                                      .catch(()=>{//do something})
}
 

Эта функция, если она возвращает разрешенное обещание, то эффект использования может быть переписан как

 useEffect(() => {
  if (!company) {
    dispatch(detailsCompany()).then(()=>{//do what is needed})
                              .catch(performRedirect)
  }
}, [dispatch, company]);
 

Это гарантирует, что если данные компании не удастся получить, произойдет перенаправление.

Для выполнения перенаправления может быть сохранено отдельное состояние, например

 const [redirect,setRedirect] = useState(false);
 

Таким образом, функция выполнения перенаправления будет выглядеть так

 const performRedirect = ()=>setRedirect(true)
 

Тег redirect should следует использовать в зависимости от значения этого состояния

  {!redirect?(company ? (
    userInfo?.isAdmin ? (
      <DashboardScreen />
    ) : (
      <HomeScreen />
    )
  )):(
    <Redirect to="/setup" />
  )}
 

}

если перенаправление состояния является ложным, вторая часть не будет выполнена.

Комментарии:

1. Спасибо за вашу помощь, сэр. Я немного изменил концепцию вашего кода. Теперь это работает. вместо заданных значений в catch() . Я определяю переменную в действии. например, полезная нагрузка: { компания: данные.компания[0], перенаправление: данные.компания[0] ? ‘/’ : ‘/настройка’, },. и проверьте наличие этого значения в маршрутизаторе, как в вашем коде. Спасибо, сэр