[英]react: how to set state on page render
我正在使用react并尝试在页面渲染上设置状态,但它一直抛出以下错误。
- -错误 - -
超过最大更新深度。 当组件重复调用componentWillUpdate或componentDidUpdate内部的setState时,可能会发生这种情况。 React限制了嵌套更新的数量,以防止无限循环。
- -错误 - -
下面是我的侧边栏组件的代码。 我正在使用Context API进行数据管理,如代码中所示,并且尝试使用通过Context API Consumer获得的值来设置showContext方法中角色的状态。
import React, { Component, PropTypes } from "react";
import { Menu, Icon } from "antd";
import { BrowserRouter as Router, Link, Route, Switch } from "react-router-dom";
import AdminPage from "../components/Admin/AdminPage";
import App from "../App";
import "../components/Login/LoginPage";
import { LoginContext } from "../context/LoginContext";
export default class MainMenu extends React.Component {
constructor(props) {
super(props);
this.state = {
roleValue: "admin",
status: false
};
this.showContext = this.showContext.bind(this);
}
showContext(context) {
let role = context;
if (this.state.roleValue == role) {
this.setState({
roleValue : "admin",
});
}
}
render() {
if (window.location.href == "http://localhost:8081/") {
var loginHeader =
<Menu
theme="dark"
mode="horizontal"
defaultSelectedKeys={["2"]}
selectedKeys={[location.pathname]}
>
{this.props.children}
<Menu.Item key="mastering">Mastering</Menu.Item>
</Menu>;
}
else {
if (this.state.roleValue == "general") {
var generalHeader1 =
<Menu
theme="dark"
mode="horizontal"
defaultSelectedKeys={["2"]}
selectedKeys={[location.pathname]}
>
{this.props.children}
<Menu.Item key="mastering">Mastering</Menu.Item>
<Menu.Item>
<Link to="/"> Logout</Link>
</Menu.Item>
<Menu.Item>
<Link to="/home">Home</Link>
</Menu.Item>
</Menu>;
}
else {
var generalHeader2 =
<Menu
theme="dark"
mode="horizontal"
defaultSelectedKeys={["2"]}
selectedKeys={[location.pathname]}
>
{this.props.children}
<Menu.Item key="mastering">Mastering</Menu.Item>
<Menu.Item>
<Link to="/"> Logout</Link>
</Menu.Item>
<Menu.Item>
<Link to="/admin">Admin</Link>
</Menu.Item>
<Menu.Item>
<Link to="/home">Home</Link>
</Menu.Item>
</Menu>;
}
}
return (
<div>
{loginHeader}
{generalHeader1}
{generalHeader2}
<LoginContext.Consumer>
{(context) => (
this.showContext(context.state.role)
)
}
</LoginContext.Consumer>
</div>
);
}
}
setState()
导致对render()
的调用。 因此,如果在render()
调用setState()
,则将获得无限递归。 不要这样做。 而是在React和您使用的其他库定义的框架中找到正确的方法来执行所需的操作。
React组件等待其自身状态的任何更改,并在正常条件下进行支撑,并且当发生更改时,它将调用Render方法并期望返回一个组件或null。
您要做的是:组件启动并尝试进行其第一个渲染,然后设置请求另一个渲染的组件状态,然后再次设置状态,这样就继续进行。 它相互循环调用。
在Render方法之外设置状态以避免这种情况。
您正在以错误的方式进行操作,因为您正在设置渲染内部的状态,因此渲染循环将是无限的。
请检查此链接,它将帮助您解决问题,如果在实施后仍然遇到任何问题,请告诉我,我将很乐意为您提供帮助。
参考链接: https : //reactjs.org/docs/context.html#dynamic-context
使用React生命周期方法componentDidMount来处理与setState相关的任务。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.