reactjs - 如何将反应路由器错误与私有路由一起添加
问题描述
我正在使用 react 和 react-router v4 进行路由。我创建了 PrivateRoutes 进行身份验证,并且由于我已经实现了它们,因此我无法使用错误路由进行不匹配。
每次我点击错误的页面时,错误路线都在工作,但问题是它每次都会为任何路线呈现。
我尝试创建常规,但我打开的每个页面都会先呈现,然后再呈现,我看到它应该是
const Error = () => {
console.log('error showing');
return (
<div>
<p>Error: Route doesn't exist</p>
</div>
);
};
const PrivateRoute = ({ component: Component, token, error, ...rest }) => (
<Route
{...rest}
render={props => (
token !== '' ? <Component {...props} /> : <Redirect to="/login" />
)}
/>
);
render() {
return (
<BrowserRouter>
<Switch>
<Route path="/login" component={Login} />
<Route path="/signup" component={Signup} />
<Layout>
<PrivateRoute path="/" component={Home} exact token={this.props.login.token} />
<PrivateRoute path="/upload" component={Upload} exact token={this.props.login.token} />
<PrivateRoute path="/certificates" component={Certs} exact token={this.props.login.token} />
<Route component={Error} />
<PrivateRoute path="/transactions" component={Tables} exact token={this.props.login.token} />
<PrivateRoute path="/issue" component={Issue} token={this.props.login.token} />
<Route component={Error}/>
</Layout>
</Switch>
</BrowserRouter>
);
}
}
解决方案
您遇到的问题是您正在渲染路由而没有任何 Switch 案例包装 PrivateRoutes。由于 Layout 组件在外部 Switch 语句中渲染 if/login
和/signup
routes 不匹配,因此它将自动渲染,而不考虑哪个 PrivateRoute 匹配。因此,您需要将渲染为组件的路由包装在children
其中Layout
,Switch
并且只有一个Error
路由实例
处理 PrivateRoutes 的正确方法如下。
render() {
return (
<BrowserRouter>
<Switch>
<Route path="/login" component={Login} />
<Route path="/signup" component={Signup} />
<Layout>
<Switch>
<PrivateRoute path="/" component={Home} exact token={this.props.login.token} />
<PrivateRoute path="/upload" component={Upload} exact token={this.props.login.token} />
<PrivateRoute path="/certificates" component={Certs} exact token={this.props.login.token} />
<PrivateRoute path="/transactions" component={Tables} exact token={this.props.login.token} />
<PrivateRoute path="/issue" component={Issue} token={this.props.login.token} />
<Route component={Error}/>
</Switch>
</Layout>
</Switch>
</BrowserRouter>
);
}
推荐阅读
- visual-studio - 使用 Visual Studio 容器工具调试 blazor wasm
- ruby-on-rails - 在集成 Active Storage 和 Google Cloud Storage 时,storage.yml 中的“项目”键真的有必要吗?
- ffmpeg - 当输入是实时相机设备时,使用输入帧率选项(在 FFmpeg 中)时的预期行为是什么?
- java - spring mvc属性文件中linux home的路径
- freeswitch - FreeSWITCH 中的内置(或嵌入式)语言和使用事件套接字库 (ESL) 的脚本有什么区别?
- gitlab - 在 Digital Ocean 上升级 GitLab 时没有登录页面
- powerbi - 基于 Power BI 中的最后一次匹配的联接表
- php - 包含条件的异常
- asynchronous - 为什么这个使用 go 块的 clojure 代码不起作用?
- shopify - 在 Shopify 中,如何按最近的优先顺序设置评论的排序顺序?