#reactjs #react-router
#reactjs #реагировать-маршрутизатор
Вопрос:
Когда я пытаюсь изменить состояние через форму входа в мое приложение, оно выдает сообщение об ошибке:
Error: 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.
Я не вижу, где я вызвал бесконечный цикл. Вот app.js
где возникает проблема:
class App extends React.Component {
state = {
email: '',
password: '',
loggedIn: false,
token: '',
posts: [],
title: '',
description: '',
postSubmitted: false,
};
handleChange = event => {
this.setState({
[event.target.name]: event.target.value,
});
};
logIn = async () => {
try {
const response = await Axios.post(
'http://localhost:3000/api/user/login',
{
email: this.state.email,
password: this.state.password,
},
);
//REACT SAYS THE ERROR OCCURS HERE!
this.setState({
loggedIn: true,
token: response.data,
});
console.log(this.state);
} catch (err) {
console.log(err.response);
}
};
//other code
render() {
return (
//components
<Route path="/login">
<Login
handleChange={this.handleChange}
logIn={this.logIn}
loggedIn={this.state.loggedIn}
/>
</Route>
);
}
}
React говорит, что проблема возникает, когда я использую this.setState
для установки значений для loggedIn
и token
, но я не уверен, как это вызывает цикл. Вот мой LoginForm.js
файл, в котором я передаю свою функцию входа в систему в качестве реквизита:
function LoginForm(props) {
const loggedIn = props.loggedIn;
return loggedIn ? (
<Redirect to={'/'} />
) : (
<div className="login-cont">
<h1>Log In</h1>
<label> Email adress</label>
<br />
<input
type="text"
id="email"
name="email"
placeholder="John@email.com"
onChange={props.handleChange}
/>
<br />
<label> Password</label>
<br />
<input
type="text"
id="password"
name="password"
placeholder="Password"
onChange={props.handleChange}
/>
<br />
<input type="submit" onClick={props.logIn} />
</div>
);
}
Где я ошибся? Это проблема с тем, как я передал функции в качестве реквизита?
Комментарии:
1. В данном коде не вижу ничего, что могло бы это сделать. Что еще происходит при изменении
loggedIn/token
? Есть ли у вас какие-либо методы жизненного цикла, такие какcomponentDidUpdate
? Вызываете ли вы какие-либо функции в рендеринге?2. Когда я меняю
loggedin
значение на true, оно перенаправляет со страницы входа на страницу hom. У меня нетcomponentDidUpdate
и я не вызываю никаких функций в методе жизненного цикла рендеринга.3. Можете ли вы попробовать преобразовать это в воспроизводимый пример в работающем codesandbox?
Ответ №1:
Эта ошибка возникает, когда цикл или повторно установленное состояние использует into componentWillUpdate
или componentDidUpdate
.React ограничивает количество вложенных обновлений, чтобы предотвратить бесконечные циклы.
я предлагаю вам попробовать эти два способа, сначала вместо использования async
, используйте .then().catch
, а в вашем then
сделайте свое установленное состояние. здесь вы можете увидеть примеры
или, в качестве альтернативы, поставьте if statement
после вашего try
и скажите, если у вас был пользователь в ответе, выполните установленное состояние.