【问题标题】:Redirect does not redirect to home page instead redirects to setup page with redux重定向不重定向到主页,而是重定向到使用 redux 的设置页面
【发布时间】:2021-08-12 01:36:07
【问题描述】:

我想在 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 操作完成后,公司变量具有值,但它被重定向到设置页面而不是主页或仪表板。

【问题讨论】:

  • 函数detailsCompany()是用redux-thunk写的吗?
  • 是的。 redux-thunk 用来写 detailsCompany()

标签: reactjs redux react-router


【解决方案1】:

初始渲染上的组件没有定义公司字段。因此,这将转到执行重定向的代码路径,甚至在获取公司详细信息之前。

即使公司详细信息已完成,页面已被重定向。处理此问题的方法之一是

假设detailsCompany() 是这样的

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

如果这个函数返回一个已解决的promise,那么useEffect可以重写为

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" />
  )}

}

如果状态重定向为 false,则不会执行第二部分。

【讨论】:

  • 感谢您的帮助,先生。我稍微改变了你的代码概念。现在可以了。而不是在 catch() 中设置值。我正在定义变量。像有效载荷:{公司:data.company[0],redirectTo:data.company[0]? '/' : '/设置', },。并像您的代码一样在路由器中检查该值。谢谢楼主
最近更新 更多