browserHistory 没有移动到 React 中的新组件

browserHistory not Moving to New Component in React

我在 React 中遇到了这个奇怪的身份验证问题。

当用户登录时,authentication prop 设置为 true。如果用户尝试进入路由并且身份验证未定义或为假,那么我会将他们推回登录页面。

目前看起来是这样的:

PersonId 组件

  componentWillMount() {
    console.log("MOUNTING PERSON ID COMPONENT IF AUTHENTICATED IS TRUE", this.props.authenticated)
    if (!this.props.authenticated) {
        browserHistory.push("/login");     
      }
    }


 render() {    
    if(this.props.user.type == "Admin") 

问题是,即使 this.props.authenticated = undefined,甚至当浏览器历史将组件推送到登录路由时,PersonId 组件的 render 方法仍在播放。

这没有意义。如果我将一个组件推送到另一条路线,为什么它仍然呈现 PersonId 组件?

componentWillMount() {
    console.log("MOUNTING PERSON ID COMPONENT IF AUTHENTICATED IS TRUE", this.props.authenticated)
    if (!this.props.authenticated) {
         browserHistory.push("/login");     
         return; 
    }
}

试试这个会有用的。组件仍将呈现,因为您没有中断 if 循环。

您使用的方式应该有效,您可以再做一件事,将相同的检查也放在 renderreturn null 中,它不会 render 任何东西,例如这个:

render() { 
      if (!this.props.authenticated) {
          return null;
      }
      ....
}

另一种选择是将所有私有组件包装在 HOC(高阶组件)中,如下所示:

  export default function CheckForAuth(Component) {
            return (
                class PrivateComponent extends React.component{
                    constructor() {
                        this.state = {
                            isAuthed: false
                        }
                    }
                    componentDidMount() {
                        //if user is authenticated set isAuthed to true
                    }

                    redner() {
                        let rednerThis;
                        if(this.state.isAuthed) {
                            rednerThis = <Component {...this.props} />
                        }
                        return (
                            <div>
                                {rednerThis}
                            </div>
                        )
                    }
                }
            )
    }

你这里有一个函数,它以一个 React 组件作为参数。然后它 returns 一个新创建的 class 有一个布尔值 on state 设置为 true 或 false 取决于你检查用户是否通过身份验证。如果 isAuthed,则呈现作为参数传入的组件,否则重定向到您的登录页面。

这将为您提供与您所追求的功能相同的功能,但带有仅用于检查用户身份验证一次的代码。与您当前的设置相反,每个组件都检查两次身份验证。一次在 willmount 中,一次在渲染中。