【问题标题】:React render private route after redux(user authentication) is updated更新redux(用户身份验证)后反应渲染私有路由
【发布时间】:2018-05-24 01:49:28
【问题描述】:

PrivateRoute 在 Redux 从服务器获取当前用户数据之前渲染。解决此问题的最佳方法是什么?

组件如下所示。 userAuth.isAuthenticated 最终会更新为 true,但它会在更新之前先呈现 <Redirect to="/login" />

const userAuth = {
  isAuthenticated: false
}

const PrivateRoute = ({ component: Component, ...rest }) => (
  <Route {...rest} render={(props) => (
    // PROBLEM: this renders before Redux gets user authentication data from the server
    userAuth.isAuthenticated ? <Component {...props} /> : <Redirect to="/login" />
  )}/>
)

class App extends Component {
  componentDidMount() {
    // Get current user data when user refresh the browser
    // This sets isLoginSuccess: true is current user is logged-in in Redux store
    this.props.getCurrentUserSession();
  }

  render() {
    // Show loading icon while fetching current user data
    if(this.props.user.isFetchingCurrentUserSession){
      return (<div><img src={squareLogo} className="logo-loading" alt="Loading icon" /></div>);
    }

    // Set current user authentication status
    userAuth.isAuthenticated = this.props.user.isLoginSuccess

    return (
      <Router>
        <div>
          <Route path="/public" component={Public} />
          <PrivateRoute path="/private" component={Private} />
        </div>
      </Router>
    );
  }
}

function mapStateToProps(state) {
  return state
}

function mapDispatchToProps(dispatch) {
  return bindActionCreators({
    getCurrentUserSession
  }, dispatch);
}

export default connect(mapStateToProps, mapDispatchToProps)(App)

【问题讨论】:

  • 这是您的实际代码吗?
  • @devserkan是的,部分代码。
  • 为什么不直接把isLoginSuccess传给PrivateRoute呢?

标签: reactjs redux react-router


【解决方案1】:

你可以这样做:

1.将isAuthenticated初始化为null

2.in render return 使用私有组件的条件渲染

const userAuth = {
 isAuthenticated: null
}

in App render return:

return (
  <Router>
    <div>
      <Route path="/public" component={Public} />
      {(userAuth.isAuthenticated!==null)?<PrivateRoute path="/private" 
      component={Private} />:null}
    </div>
  </Router>
);

【讨论】:

  • 刚刚也实现了这个。对isAuthenticated 使用nullfalsetrue 效果很好,Redux 也一样。但是,当在 Switch 的底部使用包罗万象的重定向时,使用相同的逻辑来安装整个 Switch 而不是 PrivateRoute 可能更有用。菜单也可以使用相同的逻辑。
猜你喜欢
  • 2021-08-06
  • 2021-04-08
  • 1970-01-01
  • 2020-11-12
  • 2018-12-19
  • 2018-05-21
  • 2022-08-15
  • 1970-01-01
  • 2018-09-11
相关资源
最近更新 更多