最初这是App.js中路由的样子:
应用程序.js
<Route
path="/home"
name="Home"
render={props => <DefaultLayout {...props} />
/>
DefaultLayout.js
<Switch>
{routes.map((route, idx) => {
return route.component ? (
<Route
key={idx}
path={route.path}
exact={route.exact}
name={route.name}
render={props => <route.component {...props} />}
/>
) : null;
})}
<Redirect from="/home" to="/home/dashboard" />
</Switch>
所以基本上,/home路由指向DefaultLayout组件,该组件包含应用程序的所有嵌套路由。这完美地工作。
因为只有经过身份验证的用户才能访问主页,所以我实现了一个PrivateRoute 组件:
PrivateRoute.js
import React from "react";
import { Route, Redirect } from "react-router-dom";
import { connect } from "react-redux";
import PropTypes from "prop-types";
const PrivateRoute = ({ component: Component, auth, ...rest }) => (
<Route
{...rest}
render={props =>
auth.isAuthenticated === true ? (
<Component {...props} />
) : (
<Redirect to="/" />
)
}
/>
);
PrivateRoute.propTypes = {
auth: PropTypes.object.isRequired
};
const mapStateToProps = state => ({
auth: state.auth
});
export default connect(mapStateToProps)(PrivateRoute);
应用程序.js
<PrivateRoute
exact
name="Home"
path="/home"
component={DefaultLayout}
/>
现在,登录后我得到一个空白屏幕。(尽管我确实被重定向到/home/dashboard)。因此, DefaultLayout组件的内部路由不再正常工作。
备注:我发现DefaultLayout组件中的嵌套路由必须在App.js中定义才能正常工作。例如:
DefaultLayout.js
<Redirect from="/home" to="/home/dashboard" />
应用程序.js
<PrivateRoute
exact
name="Dashboard"
path="/home/dashboard"
component={Dashboard}
/>
但是,我不能对所有路线都这样做。奇怪的是,在使用 PrivateRoute 之前,嵌套路由可以完美运行。而且我不明白为什么PrivateRoute组件使DashboardLayout内的嵌套路由无法正常运行?