[英]Why am I getting an Error: Maximum update depth exceeded.when I have no infinite loops?
[英]I am getting the following error while creating a signin page using react : Error: Maximum update depth exceeded
错误:超过最大更新深度。 当组件在 componentWillUpdate 或 componentDidUpdate 中重复调用 setState 时,可能会发生这种情况。 React 限制了嵌套更新的数量以防止无限循环。
我收到上述错误,但在我的代码中找不到任何无限循环。 请帮忙
import React, { useState } from "react";
import Base from "../core/Base";
import { Redirect } from "react-router-dom";
import {
signin,
authenticate,
isAuthenticated,
} from "../auth/helper/authapicalls";
const Signin = () => {
const [values, setValues] = useState({
email: "",
password: "",
error: "",
loading: false,
didRedirect: false,
});
const { email, password, error, loading, didRedirect } = values;
var user = isAuthenticated();
const handleChange = (name) => (event) => {
setValues({ ...values, error: false, [name]: event.target.value });
};
const onSubmit = (event) => {
event.preventDefault();
setValues({ ...values, error: false, loading: true });
signin({ email, password })
.then((data) => {
if (data.error) {
setValues({ ...values, error: data.error, loading: false });
} else {
authenticate(data, () => {
setValues({ ...values, didRedirect: true });
});
}
})
.catch(console.log("Signin request failed"));
};
const performRedirect = () => {
if (didRedirect) {
if (user) {
return <Redirect to="/admin/dashboard" />;
}
}
};
const loadingMesage = () => {
return (
loading && (
<div className="alert alert-warning">
<h3>Loading...</h3>
</div>
)
);
};
const errorMessage = () => {
return (
<div className="row">
<div className="col-md-6 offset-sm-3 text-left">
<div
className="alert alert-danger"
style={{ display: error ? "" : "none" }}
>
{error}
</div>
</div>
</div>
);
};
const signinForm = () => {
return (
<div className="row">
<div className="col-md-6 offset-sm-3 text-left">
<form>
<div className="form-group">
<label className="text-dark">Email</label>
<input
onChange={handleChange("email")}
value={email}
className="form-control"
type="email"
/>
</div>
<div className="form-group">
<label className="text-dark">Password</label>
<input
onChange={handleChange("password")}
value={password}
className="form-control"
type="password"
/>
</div>
<button onClick={onSubmit} className="btn btn-datk btn-block">
Sign In
</button>
</form>
</div>
</div>
);
};
return (
<Base>
<div className="text-dark text-center mb-5 p-4">
<h3>Sign in</h3>
</div>
{loadingMesage()}
{errorMessage()}
{signinForm()}
{performRedirect()}
</Base>
);
};
export default Signin;
这是您的handleChange
事件处理程序。 一旦组件呈现,您就会调用它。 但是你必须绑定它。 我使用箭头函数做了同样的事情。
import React, { useState } from "react";
import Base from "../core/Base";
import { Redirect } from "react-router-dom";
import {
signin,
authenticate,
isAuthenticated,
} from "../auth/helper/authapicalls";
const Signin = () => {
const [values, setValues] = useState({
email: "",
password: "",
error: "",
loading: false,
didRedirect: false,
});
const { email, password, error, loading, didRedirect } = values;
var user = isAuthenticated();
const handleChange = (name) => (event) => {
setValues({ ...values, error: false, [name]: event.target.value });
};
const onSubmit = (event) => {
event.preventDefault();
setValues({ ...values, error: false, loading: true });
signin({ email, password })
.then((data) => {
if (data.error) {
setValues({ ...values, error: data.error, loading: false });
} else {
authenticate(data, () => {
setValues({ ...values, didRedirect: true });
});
}
})
.catch(console.log("Signin request failed"));
};
const performRedirect = () => {
if (didRedirect) {
if (user) {
return <Redirect to="/admin/dashboard" />;
}
}
};
const loadingMesage = () => {
return (
loading && (
<div className="alert alert-warning">
<h3>Loading...</h3>
</div>
)
);
};
const errorMessage = () => {
return (
<div className="row">
<div className="col-md-6 offset-sm-3 text-left">
<div
className="alert alert-danger"
style={{ display: error ? "" : "none" }}
>
{error}
</div>
</div>
</div>
);
};
const signinForm = () => {
return (
<div className="row">
<div className="col-md-6 offset-sm-3 text-left">
<form>
<div className="form-group">
<label className="text-dark">Email</label>
<input
onChange={()=>handleChange("email")}
value={email}
className="form-control"
type="email"
/>
</div>
<div className="form-group">
<label className="text-dark">Password</label>
<input
onChange={()=>handleChange("password")}
value={password}
className="form-control"
type="password"
/>
</div>
<button onClick={onSubmit} className="btn btn-datk btn-block">
Sign In
</button>
</form>
</div>
</div>
);
};
return (
<Base>
<div className="text-dark text-center mb-5 p-4">
<h3>Sign in</h3>
</div>
{loadingMesage()}
{errorMessage()}
{signinForm()}
{performRedirect()}
</Base>
);
};
export default Signin;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.