gpt4 book ai didi

reactjs - react-router redirect 不会更改 Switch 中的 url

转载 作者:行者123 更新时间:2023-12-05 02:59:41 25 4
gpt4 key购买 nike

我正在使用 react-router 来设置我的应用程序,并尝试使用 <Redirect/>设置路由器进行身份验证。

Route组件有两个不同的组件,一个是private Route , 另一个是 public route .

预期结果:当 auth 为 false 时,页面应该跳回到我设置的公共(public)页面 <Redirect to={"/public"} />到目前为止,路由似乎工作正常,但重定向无法正常工作。欢迎任何想法!谢谢!!

PrivateRoute

interface PrivateRouteProps {
isLogin: boolean;
privateRoutes: RouteItem[];
}

const PrivateRoute: React.FunctionComponent<PrivateRouteProps> = (
props: PrivateRouteProps
) => {
return (
<>
{props.isLogin ? (
props.privateRoutes.map(item => {
return <Route key={item.path} {...item} />;
})
) : (
<Redirect to={PUBLIC.path} />
)}
</>
);
};

PublicRoute

interface PublicProps {
publicRoutes: RouteItem[];
}

const PublicRoute: React.FC<PublicProps> = (props: PublicProps) => {
return (
<>
{props.publicRoutes.map(route => (
<Route key={route.path} {...route} />
))}
</>
);
};

Route

<BrowserRouter>
<Switch>
<PublicRoute publicRoutes={publicRoutes} />
<PrivateRoute privateRoutes={privateRoutes} isLogin={login} />
</Switch>
</BrowserRouter>

更新正如所接受的答案所提到的,这都是关于 <Switch/> 的。与片段一起工作,所以我修改了我的路线如下,它就像一个魅力。只是更新它,因为有人可能有类似的问题。

<BrowserRouter>

<Switch>
{publicRoutes.map(item => {
return <Route key={item.path} {...item}/>
})}
{privateRoutes.map(item => {
return <PrivateRoute key={item.path}
exact={item.exact}
component={item.component}
path={item.path}
redirectPath={SIGN_IN.path}
/>

})}
</Switch>
</BrowserRouter>

最佳答案

我已经阅读了您的代码并归结为一件事。组件的方式 <Switch>使用片段 <></> .它只寻找第一个 React Fragment,因为他们不想横穿一棵树:

https://github.com/ReactTraining/react-router/issues/5785

要解决这个问题,您需要删除组件中的 React.Fragment。所以你的应用程序看起来像:

<Switch> 
<Route ...>
<Route ...>
<Route ...>
</Switch>

不是(顺便说一句,现在是这样)

      <Switch> 
//it will only sees the first one //if you switch orders - Private with Public
// Private will work but not Public anymore :(
<React.Fragment>
<Route ...>
<Route ...>
</React.Fragment>
<React.Fragment>
<Route ...>
</React.Fragment>
</Switch>

另一个解决方案(这就是我所做的,因为我对 TypeScript 的精通程度不足以更改类型和返回值)是在您的 switch 应用程序中添加一个包装器并处理私有(private)的返回在 <Route> 中使用 render 方法的路由如下所示:

  //index.tsx
<Switch>
<>
<PublicRoute publicRoutes={publicRoutes}/>
<PrivateRoute privateRoutes={privateRoutes} isLogin={login}/>
</>
</Switch>

这会导致无限循环重新渲染的另一个错误(同样, react 路由器可能对嵌套路由有不好的时间)并解决这个问题,您将对您的 PrivateRoutes 执行以下操作组件:

  //PrivateRoute.tsx
return (
<>
{props.privateRoutes.map(item =>
<Route key={item.path} exact path={item.path} render={() => (
!props.isLogin
? (
<Redirect to={PUBLIC.path}/>
):
//HOC transforming function Component into Component
// @ts-ignore (you can deal here better than me hehehe)
((PrivateComponent)=><PrivateComponent/>)(item.component)
)}/>)}
</>
);

TL,DR:您通过添加 <></> 来增加嵌套的复杂性(转换为 React.Fragment)在你的结构中。如果你删除它们或按照上面的代码你应该没问题

希望我对您有所帮助。祝你好运! :)

关于reactjs - react-router redirect 不会更改 Switch 中的 url,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57635090/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com