请在标记为重复之前正确阅读此内容,我向您保证,我已阅读并尝试了每个人在 stackoverflow 和 github 上针对此问题提出的所有建议。
我的应用程序中有一条路线,如下所示;
<div>
<Header compact={this.state.compact} impersonateUser={this.impersonateUser} users={users} organisations={this.props.organisations} user={user} logOut={this.logout} />
<div className="container">
{user && <Route path="/" component={() => <Routes userRole={user.Role} />} />}
</div>
{this.props.alerts.map((alert) =>
<AlertContainer key={alert.Id} error={alert.Error} messageTitle={alert.Error ? alert.Message : "Alert"} messageBody={alert.Error ? undefined : alert.Message} />)
}
</div>
路由渲染Routes
渲染一个切换用户角色的组件,并基于该角色延迟加载正确的路由组件,该路由组件渲染主页面的开关。简化后如下所示。
import * as React from 'react';
import LoadingPage from '../../components/sharedPages/loadingPage/LoadingPage';
import * as Loadable from 'react-loadable';
export interface RoutesProps {
userRole: string;
}
const Routes = ({ userRole }) => {
var RoleRoutesComponent: any = null;
switch (userRole) {
case "Admin":
RoleRoutesComponent = Loadable({
loader: () => import('./systemAdminRoutes/SystemAdminRoutes'),
loading: () => <LoadingPage />
});
break;
default:
break;
}
return (
<div>
<RoleRoutesComponent/>
</div>
);
}
export default Routes;
然后是路由组件
const SystemAdminRoutes = () => {
var key = "/";
return (
<Switch>
<Route key={key} exact path="/" component={HomePage} />
<Route key={key} exact path="/home" component={HomePage} />
<Route key={key} path="/second" component={SecondPage} />
<Route key={key} path="/third" component={ThirdPage} />
...
<Route key={key} component={NotFoundPage} />
</Switch>
);
}
export default SystemAdminRoutes;
所以问题是每当用户从“/”导航到“/second”等...应用程序重新渲染Routes
,这意味着角色切换逻辑被重新运行,用户特定的路由被重新加载和重新渲染,页面上的状态是丢失的。
我尝试过的事情;
React.lazy()
并且它有同样的问题。component={Routes}
并通过 redux 获取道具我在应用程序组件中渲染主要路线组件的方式一定有问题,但我很难过,有人能解释一下吗?另请注意,这与 react-router 的开关无关。
编辑:我已经修改了我的一个旧测试项目来演示这个错误,您可以从https://github.com/Trackerchum/route-bug-demo克隆 repo - 一旦 repo 被克隆,只需在 root 中运行 npm install目录和 npm 启动。当重新渲染/重新安装 Routes 和 SystemAdminRoutes 时,我已将其记录到控制台
编辑:我已经在 GitHub 上打开了一个关于这个的问题,可能的错误