在标记为副本之前,请仔细阅读此内容,我向您保证,我已经阅读并尝试了每个人在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>
route renderingRoutes
呈现打开用户角色的组件,并基于该角色惰性加载正确的Routes组件,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;
因此,问题是每当用户从/导航到/秒等...应用程序重新渲染路由
,这意味着角色切换逻辑被重新运行,用户特定的路由被重新加载和重新渲染,页面上的状态丢失。
我尝试过的事情;
我在应用程序组件中呈现主路由组件的方式一定有问题,但我很困惑,有人能解释一下吗?还要注意,这与react路由器的交换机无关。
编辑:我修改了一个旧的测试项目来演示这个bug,你可以从中克隆repohttps://github.com/Trackerchum/route-bug-demo -一旦repo被克隆,只需在root dir中运行npm安装,然后npm启动。当重新呈现/重新装载路由和SystemAdminRoutes时,我将其记录到控制台
编辑:我在GitHub上发布了一个关于这个的问题,可能是bug
在每次路径更改时路由重新渲染组件,尽管路径为“/”
只需将“/”放在末尾,并将其他路线放在其上方。基本上,它匹配第一个可用选项,因此每次都匹配“/”。
<Switch>
<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} exact path="/" component={HomePage} />
<Route key={key} component={NotFoundPage} />
</Switch>
OR
<Switch>
<Route path="/second" component={SecondPage} />
<Route exact path="/" component={HomePage} />
<Route path="*" component={NotFound} />
</Switch>
像这样重新排序,它将开始工作。简单:)
碰到这个问题就这样解决了:
在组件中:
import {useParams} from "react-router-dom";
const {userRole: roleFromRoute} = useParams();
const [userRole, setUserRole] = useState(null);
useEffect(()=>{
setUserRole(roleFromRoute);
},[roleFromRoute]}
在路线上:
<Route path="/generic/:userRole" component={myComponent} />
这将设置一个带有角色参数的通用路由。
在组件中,useParams拾取已更改的参数,useEffect设置一个状态以触发渲染和所需的任何业务逻辑。
},[userRole]);
直接从一个开发者那里找到了发生这种情况的原因(归功于Tim Dorr)。路由每次都重新呈现组件,因为它是匿名函数。这在树下发生两次,分别是应用程序内和路由(在可加载函数内),如下所示。
<Route path="/" component={() => <Routes userRole={user.Role} />} />
需要
<Routes userRole={user.Role} />
和
loader: () => import('./systemAdminRoutes/SystemAdminRoutes')
基本上,我的整个方法需要重新思考
编辑:我最终通过使用route上的render方法修复了此问题:
<Route path="/" render={() => <Routes userRole={user.Role} />} />
react&React-Router的新功能。我正在使用react-router-4 我有以下组件-login-home-header-sidebar-content 登录组件没有标题或侧栏。 这就是我的路由 应用程序JS 然后在我的Home组件中,我有侧边栏和内容。 home.js呈现方法 侧边栏组件有一个链接,该链接具有“to”值“/home/dashboard”。 不幸的是,这并不奏效。单击
我意识到以前有人问过我这个问题,请容忍我,因为我还在学习这个问题。我想我已经尝试了所有的解决方案,但是没有运气。 问题是:当重定向到时,它没有呈现预期的组件() 我已经实现了一个,如下所示; privaterout.js 这就是我使用它的地方; index.js 在这个问题中要补充几点: 我确认重定向确实发生在(我通过将
我有一个名为Dashboard的父组件,它被呈现为路由,如下所示: 我试着嘲笑每个人在嵌套路由上的解决方案,但我似乎无法解决我的问题。
问题内容: 我正在使用react-router开发一个React应用程序。我有一个项目页面,其URL如下: 当项目组件加载时,我从componentDidMount事件触发了对该项目的数据请求。我现在遇到一个问题,如果我直接在两个项目之间切换,那么只有id会这样改变… componentDidMount不会再次触发,因此不会刷新数据。我是否应该使用另一个生命周期事件来触发我的数据请求,或者使用其他
我正在使用React-Router开发一个react应用程序。我有一个项目页面,其url如下: 当项目组件加载时,我从componentDidMount事件触发该项目的数据请求。我现在遇到了一个问题,如果我直接在两个项目之间切换,那么只有id像这样更改... componentDidMount不会再次触发,因此不会刷新数据。是否有另一个生命周期事件我应该用来触发我的数据请求或一个不同的策略来解决这
通过Group可以实现路由分组,Group 路由分组可以简化你的路由撰写: 有两种方法来使用Group: 第一种,创建Group对象,通过Group方法传入 g := tango.NewGroup() g.Get("/1", func() string { return "/1" }) g.Post("/2", func() string { return "/2" }) o :=