"react-router": "5.0.1",
<Switch>
<Route
component={TestComponent}
key={TestComponentPath}
path={TestComponentPath}
exact
/>
{
exampleCondition && (
<>
<Route
component={TestComponent2}
key={TestComponentPath2}
path={TestComponentPath2}
exact
/>
<Route
component={TestComponent3}
key={TestComponentPath3}
path={TestComponentPath3}
exact
/>
</>
)
}
<Redirect to={redirectUrl} />
</Switch>
显示的示例Switch
,Redirect
用例。
如果没有匹配的路径,应重定向到给定的redirectUrl
路径。
就像在切换结束时没有提供Redirect
一样。问题可能是由React.Fragment
内部使用的Switch
引起的。重定向删除后可以正常工作。
答案 0 :(得分:1)
<Switch>
的所有子代应为<Route>
或<Redirect>
元素。 将仅显示与当前位置匹配的第一个孩子。
https://reacttraining.com/react-router/web/api/Switch/children-node
由于使用的是Fragment,因此要添加Switch
不支持的其他子项,因此代码不会呈现。
您应按以下方式切换代码,以添加条件路由而不使用片段:
<Switch>
<Route
component={TestComponent}
key={TestComponentPath}
path={TestComponentPath}
exact
/>
{ exampleCondition &&
<Route
component={TestComponent2}
key={TestComponentPath2}
path={TestComponentPath2}
exact
/> }
{ exampleCondition &&
<Route
component={TestComponent3}
key={TestComponentPath3}
path={TestComponentPath3}
exact
/> }
<Redirect to={redirectUrl} />
</Switch>
如果您担心重复代码,可以在Route
中添加如下所示的附加层:
<Switch>
<Route
component={TestComponent}
key={TestComponentPath}
path={TestComponentPath}
exact
/>
{someCondition && [
<Route
component={TestComponent2}
key={TestComponentPath2}
path={TestComponentPath2}
exact
/>,
<Route
component={TestComponent3}
key={TestComponentPath3}
path={TestComponentPath3}
exact
/>
]}
<Redirect to={redirectUrl} />
</Switch>
答案 1 :(得分:0)
我喜欢 <ProtectedRoute>
组件的想法:
import { Component } from 'react';
import { Redirect, Route } from 'react-router-dom';
class ProtectedRoute extends Component<any> {
render() {
const { component: Component, allow, ...props } = this.props;
if (!allow) {
return <Redirect to={{ pathname: '/signin' }} />;
}
return <Route {...props} render={(props) => <Component {...props} />} />;
}
}
export default ProtectedRoute;
然后像下面这样使用它:
<Router history={history}>
<Route path={yourRootPath} component={App} exact>
<Route path="home" component={Home} />
<Route path="about" component={About} />
<ProtectedRoute path="inbox" component={Inbox} allow={this.props.mail} />
<ProtectedRoute path="contacts" component={Contacts} allow={this.props.mail} />
</Route>
</Router>
我尝试按照公认的答案使用数组,但没有用 因为JSX 表达式必须有一个父元素(也许这个 曾经在较旧的 React 版本中工作),我也不想重复 代码。