reactjs - 内部特定路线上的上下文提供者
问题描述
使用 a<Switch>
帮助我将错误的地址指向起始页,并处理用户访问限制(对某些页面)。
但我似乎无法再将上下文提供者用于他们的特定路线。
问题是我不希望上下文提供者环绕所有路由/组件。
// App.js
<Router>
<RoleInfoProvider>
<AccessWrapper>
<NavBar />
<TimesheetProvider>
<Switch>
<PrivateRoute exact path="/approvals"component={Approvals} />
<PrivateRoute exact path="/reports" component={Reports} />
<Route exact path="/timesheet" component={Timesheet} />
<Route component={Start} />
</Switch>
</TimesheetProvider>
</AccessWrapper>
</RoleInfoProvider>
</Router>
虽然实际上,我宁愿<TimesheetProvider>
只像这样环绕:
<Switch>
<PrivateRoute exact path="/approvals"component={Approvals} />
<TimesheetProvider>
<PrivateRoute exact path="/reports" component={Reports} />
<Route exact path="/timesheet" component={Timesheet} />
</TimesheetProvider>
<Route component={Start} />
</Switch>
当我访问时会发生什么/timesheet/
并被Reports
渲染Timesheet
。
我意识到这可能是我的问题,ProtectedRoute
所以我也会向您展示该组件。
import React from 'react';
import { Redirect, Route } from 'react-router-dom';
import useRoleInfo from '../hooks/useRoleInfo';
function ProtectedRoute({ path, ...rest }) {
const { roleInfo } = useRoleInfo();
if (
(path === '/approvals' && roleInfo.canAccessApprovals) ||
(path === '/reports' && roleInfo.canAccessReports)
) {
return <Route {...rest} />;
}
return <Redirect to="/" />;
}
export default ProtectedRoute;
知道如何使用Context-providers
并且Router-Switch
可以更好地工作吗?
解决方案
可能有点晚了,但它可能会在未来帮助其他人:
如果您只想分离上下文并且将其专属于某些路由,则必须创建另一个开关并分离共享相同上下文的每个路由,如下所示:
<Router>
<RoleInfoProvider>
<AccessWrapper>
<NavBar />
<Switch>
<TimesheetProvider>
<PrivateRoute exact path="/reports" component={Reports} />
<Route exact path="/timesheet" component={Timesheet} />
</TimesheetProvider>
</Switch>
<Switch>
<PrivateRoute exact path="/approvals"component={Approvals} />
<Route component={Start} />
</Switch>
</AccessWrapper>
</RoleInfoProvider>
</Router>
出于某种原因,当您使用唯一Switch
的并将上下文提供程序直接放在其中时,其余的路由将无法工作、显示、执行或类似的东西。可能是由于上下文冲突,因为 Route 已经用一些上下文渲染,突然我们添加了另一个,react 会抛出一个错误而没有调用错误。
推荐阅读
- c# - 如何为 Universal Viewer 动态创建 manifest.json
- .htaccess - 不考虑 RewriteRule Last [L] 标志?
- json - Classroom API 返回错误的截止日期
- javascript - 我想要卡片中每个元素的事件监听器
- r - input$sidebarItemExpanded 不适用于 R Shiny 中的 convertMenuItem
- css - 有没有办法修复css中自定义下拉箭头的大小?
- python - 如何在此文件中的每 4 个元素之后将输出附加到 txt 文件
- excel - 为 VBA 宏创建字典对象时遇到问题
- android - 我可以通过 AWS 接收 Android 推送通知吗?
- razor - Blazor/Razor:带枚举的 InputSelect?