在浏览器上点击刷新后反应路由器 v4 登录检查

Posted

技术标签:

【中文标题】在浏览器上点击刷新后反应路由器 v4 登录检查【英文标题】:React Router v4 login check after hitting Refresh on browser 【发布时间】:2017-11-21 18:42:30 【问题描述】:

我正在使用 react router v4 并尝试实现受保护的 api 视图。例如,如果用户在未登录时访问/add/ url,他们将被重定向到/login/,然后在成功登录后转到/add/

我能够使用from this post 的想法来实现它。但是,每当加载应用程序的初始 http 请求来自受保护的 url 时,我就会遇到问题。

例如当我在浏览器中输入 '/add/' 并按 Enter 键时,我遇到了异步问题,我的应用程序没有时间向服务器发出 ajax 请求以检查登录,因此路由器最终路由到/login/ 因为 ajax 身份验证请求尚未完成。

考虑到用户可能在'/add/' 等受保护的网址上而不是在主页'/' 上开始他们的会话这一事实,有人可以建议一般处理登录工作流程吗?

【问题讨论】:

【参考方案1】:

找到了一个简单、标准的 React 模式解决方案。除非已完成登录 ajax 检查,否则不要渲染 <Route> 组件。

因此,当应用第一次加载时,将状态 checkingLogIn 初始化为 true 并且不要渲染任何 <Route> 组件,除非它变为 false。当ajax函数检查登录完成后,调用setStatecheckingLogIn设置为false。这将导致<Route> 正确呈现和重定向。

用示例代码编辑:

componentDidMount()
// call the ajax function that checks if the user is logged in and update state when it returns; using fetch API here
 fetch(your_url, your_credentials)
   .then(
     that.setState(checkingLogIn: false, isLoggedIn: true)
        )
   .catch(...)

// render method of the React component
render()
    if(this.state.checkingLogIn)
    return (<div>Loading...</div>)
    
    else 
      return (
       <Route path=some_path render=props => <SomeComponent ...props />></Route>
      )
    


【讨论】:

以上是关于在浏览器上点击刷新后反应路由器 v4 登录检查的主要内容,如果未能解决你的问题,请参考以下文章

反应路由器 v4 重定向不起作用

使用 redux 保护的路由和身份验证反应路由器 v4

路由不适用于 React 路由器 v4

Apollo 查询在页面刷新时运行,但不使用反应路由器导航?

angular点击路由不跳转是怎么解决

刷新反应应用程序,404 错误。反应路由器问题