[英]How to update component state in function react js?
I have two components 我有两个组成部分
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.