超过最大更新深度

时间:2018-09-09 18:17:38

标签: reactjs

在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之外的其他地方?

3 个答案:

答案 0 :(得分:1)

我认为是因为您正在调用this.props.dispatch(userActions.logout()); 在构造函数中,这不是更新应用程序状态的好地方,因为这将使组件在挂载之前重新渲染,并且每次要重新渲染时,您都将再次在其构造函数中调用该函数并进行设置状态,使其陷入一个循环,在该循环中它一次又一次地调用setState,最好放置this.props.dispatch(userActions.logout());在诸如componentDidMount(){}之类的lifeCycle方法中,因此每次安装组件时,都会调用注销操作并更新应用程序状态。

答案 1 :(得分:1)

根据我的经验,我知道在箭头函数(即以ES6格式编写的函数)内调用setState会反复导致此错误。因此,我尽可能地只开始使用ES5格式功能。

答案 2 :(得分:0)

您可能不会相信我,但是我通过更改Route标签的顺序解决了这个问题。第一个是路径为“ / login”的标签,它可以正常工作。