在React中运行我的应用程序时收到错误。这个错误有很多问题,但我不知道如何解决。当我按下链接时,它会指向“登录”组件。 'http://localhost:3000/login'
这是我在网站上看到的错误:
'已超过最大更新深度。当组件重复调用componentWillUpdate或componentDidUpdate内部的setState时,可能会发生这种情况。 React限制了嵌套更新的数量,以防止无限循环。'
这是我的登录页面:
class LoginPage extends React.Component {
constructor(props) {
super(props);
// reset login status
this.props.dispatch(userActions.logout());
this.state = {
username: '',
password: '',
submitted: false
};
}
render() {
return (
<div className="col-md-6 col-md-offset-3">
<h2>Login</h2>
</div>
);
}
}
function mapStateToProps(state) {
return { auth: state.auth };
}
const loginComp = connect(mapStateToProps)(LoginPage);
export { loginComp as LoginPage };
这是路由部分。
render() {
const { alert } = this.props;
return (
<Router history={history} >
<Switch>
<PrivateRoute path="/" name="Home" component={DefaultLayout} />
<Route exact path="/login" component={LoginPage} />
</Switch>
</Router>
);
}
其中一个是DefaultLayout:
import React, { Component } from 'react';
import { Redirect, Route, Switch } from 'react-router-dom';
import { Container } from 'reactstrap';
import {
AppAside,
AppBreadcrumb,
AppFooter,
AppHeader,
AppSidebar,
AppSidebarFooter,
AppSidebarForm,
AppSidebarHeader,
AppSidebarMinimizer,
AppSidebarNav,
} from '@coreui/react';
// sidebar nav config
import navigation from '../../_nav';
// routes config
import routes from '../../routes';
import DefaultAside from './DefaultAside';
import DefaultFooter from './DefaultFooter';
import DefaultHeader from './DefaultHeader';
class DefaultLayout extends Component {
render() {
return (
<div className="app">
<AppHeader fixed>
<DefaultHeader />
</AppHeader>
<div className="app-body">
<AppSidebar fixed display="lg">
<AppSidebarHeader />
<AppSidebarForm />
<AppSidebarNav navConfig={navigation} {...this.props} />
<AppSidebarFooter />
<AppSidebarMinimizer />
</AppSidebar>
<main className="main">
<AppBreadcrumb appRoutes={routes}/>
<Container fluid>
<Switch>
{routes.map((route, idx) => {
return route.component ? (<Route key={idx} path={route.path} exact={route.exact} name={route.name} render={props => (
<route.component {...props} />
)} />)
: (null);
},
)}
<Redirect from="/" to="/dashboard" />
</Switch>
</Container>
</main>
<AppAside fixed hidden>
<DefaultAside />
</AppAside>
</div>
<AppFooter>
<DefaultFooter />
</AppFooter>
</div>
);
}
}
export default DefaultLayout;
问题可能出在这个jsx之外的其他地方?
答案 0 :(得分:1)
我认为是因为您正在调用this.props.dispatch(userActions.logout()); 在构造函数中,这不是更新应用程序状态的好地方,因为这将使组件在挂载之前重新渲染,并且每次要重新渲染时,您都将再次在其构造函数中调用该函数并进行设置状态,使其陷入一个循环,在该循环中它一次又一次地调用setState,最好放置this.props.dispatch(userActions.logout());在诸如componentDidMount(){}之类的lifeCycle方法中,因此每次安装组件时,都会调用注销操作并更新应用程序状态。
答案 1 :(得分:1)
根据我的经验,我知道在箭头函数(即以ES6格式编写的函数)内调用setState会反复导致此错误。因此,我尽可能地只开始使用ES5格式功能。
答案 2 :(得分:0)
您可能不会相信我,但是我通过更改Route标签的顺序解决了这个问题。第一个是路径为“ / login”的标签,它可以正常工作。