javascript - 如何在函数react js中更新组件状态?

标签 javascript html reactjs

我有两个组件

  • 登录组件
  • header 组件

我想在登录后在标题中显示用户名。

下面是代码...

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;

如何更改函数内的状态,因为它不允许我使用此关键字..?

错误:

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.

最佳答案

由于 setState 是从 render() 间接调用的,因此您的代码已进入渲染循环。 render()setState 调用之后调用

componentDidMount()中加载所需的数据,并在state中设置其值,并在render中检查state值,并且不要使用多个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() 可以像这样进一步优化

 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>

)

关于javascript - 如何在函数react js中更新组件状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52535906/

相关文章:

javascript - 使用 jQuery html 填充 div 时,内联 &lt;script&gt; block 焦点不会触发第二次

javascript - 如果 id 与另一个对象 id 相等,React 获取第二个对象

javascript - 如何伪造浏览器大小调整 1px 并将其恢复到原来的样子?

Javascript JSON比较/差异?

Javascript过滤器根据关联数组中的字符串在对象中查找id

Javascript 选项卡 Accordion 问题

javascript - 简单测试页中的奇怪 Javascript Bug (jQuery)

javascript - 删除特定 div block 的规范化 css

javascript - 在 React-Redux Store 中配置 devToolsExtension 和 applyMiddleware()

javascript - React.js 未渲染正确的字体很棒的图标