Ошибка «Превышена максимальная глубина обновления» в реакции и реакции-куки

Я реализовал простую форму входа в React с помощью Redux, следуя этому руководству: https://jslancer.com/blog/2017/04/27/a-simple-login-flow-with-react-and-redux/

Все работает, но когда я добавляю куки, я получаю ошибку:

Warning: Cannot update during an existing state transition (such as within render). Render methods should be a pure function of props and state.

а также:

Uncaught Invariant Violation: 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.

Я выполнил некоторую отладку, и если я уберу onChange = {e => this.setState({password: e.target.value})} из входных данных в коде ниже, ошибка исчезнет.

Есть идеи, почему следующий код не работает?

import { connect } from 'react-redux';
import { withCookies } from 'react-cookie'

class LoginForm extends Component {

  constructor(props) {
    super(props);
    this.state = {
      username: '',
      password: ''
    };
  }

  render() {
    let {username, password} = this.state;
    let { cookies, allCookies, isLoginPending, isLoginSuccess, loginError} = this.props;
    cookies.set('username', 'Ross', { path: '/', secure: true, httpOnly: true});
    console.info(cookies.get('username'));
    return (
      <form name = "loginForm" onSubmit = {this.onSubmit}>
        <div className = "form-group-collection">
          <div className = "form-group">
            <label>Username:</label>
            <input type = "text" name = "username" onChange = {e => this.setState({username: e.target.value})} value = {username}/>
          </div>
          <div className = "form-group">
            <label>Password:</label>
            <input type = "password" name = "password" onChange = {e => this.setState({password: e.target.value})} value = {password}/>
          </div>
        </div>
      </form>
    )
  }
}

const mapStateToProps = (state) => {
  return {
    isLoginPending: state.isLoginPending,
    isLoginSuccess: state.isLoginSuccess,
    loginError: state.loginError,
  };
}

export default withCookies(connect(mapStateToProps, null)(LoginForm));``` 

Вы пробовали использовать connect(mapStateToProps)(withCookies(LoginForm))?

Fernando Montoya 03.05.2019 14:53

@FernandoMontoya Попробовал сейчас, та же ошибка...

Ricardo Couto 03.05.2019 15:13

Я предполагаю, что, поскольку ваш компонент подключился к файлам cookie HoC, а затем вы вызываете cookies.set в методе render, он каждый раз обновляется, создавая бесконечный цикл. Пожалуйста, попробуйте перенести cookies.set на componentDidMount

Fernando Montoya 03.05.2019 15:14

@FernandoMontoya Это решило мою проблему, спасибо! :) Можете ли вы опубликовать ответ, чтобы я мог отметить его как правильный?

Ricardo Couto 03.05.2019 15:32
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
4
1 741
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я предполагаю, что, поскольку ваш компонент подключился к файлам cookie HoC, а затем вы вызываете cookies.set в методе render, он каждый раз обновляется, создавая бесконечный цикл. Пожалуйста, попробуйте переместить cookies.set на componentDidMount.

Удаление cookies.set из метода render решило эту проблему!

Ricardo Couto 04.05.2019 15:03

Другие вопросы по теме