javascript - 如何更新函数反应js中的组件状态?
问题描述
我有两个组件
- 登录组件
- 标题组件
我想在登录标题后显示用户名。
下面是代码...
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>
)
推荐阅读
- cypress - 赛普拉斯在提交表单时取消 api 请求
- fortran - BBedit 选项“运行”或“在终端中运行”
- git - 从 master 获取当前差异并将其转换为单个提交,而无需将每个提交应用在彼此之上
- html - 当浏览器最小化时,如何在一个部分堆栈中创建 2 列?
- regex - 具有未知子文件夹深度的 nginx 位置
- javascript - 在数组中查找元素并返回父元素
- angular - 我们如何定位以错误 *ngIf 条件开头的元素?
- sql - 在 SQL 中选择最大计数
- android - 为什么颤振中的建造者在这里打破
- google-apps-script - 迁移到 V8 运行时后触发的电子邮件无法正常工作