使用 PrivateRoute 响应异步登录检查

Posted

技术标签:

【中文标题】使用 PrivateRoute 响应异步登录检查【英文标题】:React async Logincheck with PrivateRoute 【发布时间】:2020-05-26 06:22:20 【问题描述】:

我想在 React 中使用异步 LoginCheck 创建一个 PrivateRoute。我试过这个:

class App extends React.Component 
constructor(props) 
super(props);
this.state = 
loggedIn: false



componentDidMount() 
//ASYNC FUNCTION
setTimeout(() => 
this.setState(loggedIn: true);
, 1000)


render() 

console.log("RENDERED", this.state.loggedIn);

const PrivateRoute = (component: Component, ...rest) => (
      <Route ...rest render=(props) => (
         this.state.loggedIn === true
           ? <Component ...props />
           : <Redirect to="/login" />
      )/>
    )

return(
<Router>
<Switch>
<Route path="/" exact component=Home />
<PrivateRoute path="/private" component=PrivatePage />
</Switch>
</Router>
)


但这不起作用。 在控制台中,它首先显示“RENDERED false”,然后显示第二个“RENDERED true”。因此它使用正确的参数呈现,但在 const PrivateRoute 中,他重定向到登录页面,因此loginIn 为假。 为什么?我能做什么?

【问题讨论】:

这能回答你的问题吗? Why is my React component is rendering twice? 【参考方案1】:

您可以创建一个函数 checkAuth() 来分隔验证,如下所示

import React from "react";
import 
  BrowserRouter as Router,
  Switch,
  Redirect,
  Route,
 from "react-router-dom";
import Home from "./Home";
import PrivatePage from "./Private";



export default class App extends React.Component 
  constructor(props) 
    super(props);
    this.state = 
      loggedIn: true
    
  

  componentDidMount() 
    //ASYNC FUNCTION
    setTimeout(() => 
      this.setState( loggedIn: false );
    , 1000)
  

  render() 

    console.log("RENDERED", this.state.loggedIn);

    const checkAuth = () => 
      try 
        // To be replaced with your condition
        if (this.state.loggedIn === true) 
          return true;
        

       catch (e) 
        return false;
      
      return false;
    

    const PrivateRoute = ( component: Component, ...rest ) => (
      <Route ...rest render=props => (
        checkAuth() ? (
          <Component ...props />
        ) : (
            <Redirect to= pathname: '/'  />
          )
      ) />
    )

    return (
      <Router>
        <Switch>
          <Route path="/" exact component=Home />
          <PrivateRoute path="/private" component=PrivatePage />
        </Switch>
      </Router>
    )
  

访问 url "http://localhost/private" as loggedIn: true 该路由已授权,但 0.2s 后已登录状态将更新为 false 并且受保护的路由将被重定向到主页。

【讨论】:

以上是关于使用 PrivateRoute 响应异步登录检查的主要内容,如果未能解决你的问题,请参考以下文章

React Router - PrivateRoute,登录后重定向到原始目的地

react 中实现登录鉴权

React - 登录到尝试页面后的路由和重定向

react privateRoute

xcode 5 xctest 测试异步登录网络服务

检查异步任务状态并获取其结果