简体   繁体   English

如何在函数React JS中更新组件状态?

[英]How to update component state in function react js?

I have two components 我有两个组成部分

  • Login Component 登录组件
  • Header Component 标头组件

I want to display username after login in header. 我要在登录标题后显示用户名。

Below is code... 下面是代码...

class Header extends Component {

    constructor(props) {

        super(props); 

        this.state = {         
          isLoggedIn: false
        };  
      }

    isLoggedIn = () => {    

        var flag = localStorage.getItem('loggedUser') !== null; 
        this.setState({isLoggedIn : flag}); // this line gives error
        return flag;
    }


  render() {

    if(this.isLoggedIn() == true){

    return(
      <div>
           <div className="header">          
              <div className="headerUser">Logged in as: {localStorage.getItem("loggedUser")}</div>
              <img src={Logo} className="app-logo" alt="logo" width="145" height="55" />
           </div>
      </div>
     );

    } else {

    return(
      <div>
           <div className="header">                       
              <img src={Logo} className="app-logo" alt="logo" width="145" height="55" />
           </div>
      </div>
     );

    }

    }
}
export default Header;

How to change state inside function as it does not allow me to use this keyword..? 如何更改函数内部的状态,因为它不允许我使用此关键字..?

Error : 错误:

Maximum update depth exceeded. This can happen when a component repeatedly calls setState inside componentWillUpdate or componentDidUpdate. React limits the number of nested updates to prevent infinite loops.

Your code has entered a render loop since setState is indirectly called from render() . 由于setState是从render()间接调用的,因此您的代码已进入渲染循环。 render() is called after a setState call setState调用之后调用render()

Load the required data in componentDidMount() and set its value in state and check for the state value in render, and don't use multiple return see the below code. componentDidMount()加载所需的数据,并在state中设置其值,并在render中检查状态值,并且不要使用多次return请参见以下代码。

class Header extends Component {

    constructor(props) {

        super(props); 

        this.state = {         
          isLoggedIn: false
        };  
      }
    componentDidMount() {
       var flag = localStorage.getItem('loggedUser') !== null; 
       this.setState({isLoggedIn : flag}); 
    }    


  render() {

    return(
      { this.state.isLoggedIn ?
        <div>
           <div className="header">          
              <div className="headerUser">Logged in as: {localStorage.getItem("loggedUser")}</div>
              <img src={Logo} className="app-logo" alt="logo" width="145" height="55" />
           </div>
      </div>

    : <div>
           <div className="header">                       
              <img src={Logo} className="app-logo" alt="logo" width="145" height="55" />
           </div>
      </div>

    })
  }
}
 export default Header;

return() can be further optimized like this return()可以像这样进一步优化

 return(

        <div>
           <div className="header">          
              { this.state.isLoggedIn ?<div className="headerUser">Logged in as: {localStorage.getItem("loggedUser")}</div> : null }
              <img src={Logo} className="app-logo" alt="logo" width="145" height="55" />
           </div>
      </div>

)

you're calling setState while rendering... try like 您在渲染时正在调用setState ...尝试像

class Header extends Component {

constructor(props) {

    super(props); 

    this.state = {         
      isLoggedIn: false
    };  
  }

isLoggedIn = () => {    

    var flag = localStorage.getItem('loggedUser') !== null; 
    // this.setState({isLoggedIn : flag}); // delete here 
    return flag;
}


  render() {

if(this.isLoggedIn() == true){

return(
  <div>
       <div className="header">          
          <div className="headerUser">Logged in as: {localStorage.getItem("loggedUser")}</div>
          <img src={Logo} className="app-logo" alt="logo" width="145" height="55" />
       </div>
  </div>
 );

} else {

return(
  <div>
       <div className="header">                       
          <img src={Logo} className="app-logo" alt="logo" width="145" height="55" />
       </div>
  </div>
 );

}

}
}
export default Header;

您正在isLoggedIn方法中设置状态,该方法将触发另一个渲染,并再次调用isLoggedIn等。您应该直接在render中检查状态对象( this.state.isLoggedIn ),并且只应在开始或用户状态更改时。

Well Here is your answer... 好吧,这是你的答案...

class Header extends Component {
    constructor(props) {
        super(props);
        this.state = {
            isLoggedIn: false
        };
    }

    isLoggedIn = () => localStorage.getItem('loggedUser') !== null;

    render() {
        if(this.isLoggedIn()) {
            return(
                <LoggedIn onMount={() => this.setState({isLoggedIn: this.isLoggedIn()})} />
            );
        } else {
            return(
                <div>
                    <div className="header">
                        <img src={Logo} className="app-logo" alt="logo" width="145" height="55" />
                    </div>
                </div>
            );
        }
    }
}
export default Header;

class LoggedIn extends Component {
    componentWillMount() {
        this.props.onMount();
    }
    render() {
        return (
            <div>
                <div className="header">
                    <div className="headerUser">Logged in as: {localStorage.getItem("loggedUser")}</div>
                    <img src={Logo} className="app-logo" alt="logo" width="145" height="55"/>
                </div>
            </div>
        )
    }
}

export default LoggedIn;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 从父组件 React JS 调用 map function 时如何更新子组件的 state - How to update state of child component when it get called in map function from parent component React JS 如何更新 state 然后在 function 组件中渲染本机反应 - how to update state and then render in the function component react native 如何更新 React state(功能组件)中的单个属性 - How to update a single property in a React state (function component) React js 更改 state 不会更新组件 - React js changing state does not update component 更新组件以更新状态React js - Update component on updating state React js 等待反应 state 在 function 组件中更新 - Waiting for react state to update in function component 如何在 React.js 的另一个组件中更新组件状态变量的值? - How to update the value a component's state variable in another component in React.js? 如何从react js中的父组件状态更新子组件下拉列表中的选项值? - How to update the option values in dropdown on child component from parent component state in react js? React.JS - 如何动态更新 Next.JS 路由器组件的 state? - React.JS - How to dynamically update the state of a Next.JS router component? 如何在功能组件中立即更新反应状态? - How to update react state immediately in functional component?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM