javascript - 历史钩子 React 发出警告。这是一个无操作,但它表明您的应用程序中存在内存泄漏
问题描述
在制作项目的过程中,我遇到了 React hooks 的问题。
我使用 useEffect 将 UI 重新呈现给用户分类,我使用 let history = useHistory() 来完成它,在代码部分:
if (isAuthenticated() && isAuthenticated().role === 1) {
//! Redirect to Admin dashboard
console.log('Redirect to Admin dashboard');
history.push('/admin/dashboard'); //! I found that using this code will cause a warning
} else {
//! Redirect to User dashboard
console.log('Redirect to User dashboard');
history.push('/user/dashboard'); //! I found that using this code will cause a warning
}
history.push 生成警告。警告:无法对未安装的组件执行 React 状态更新。这是一个空操作,但它表明您的应用程序中存在内存泄漏。要解决此问题,请在 useEffect 清理函数中取消所有订阅和异步任务。
我的完整代码:
const Signin = () => {
let history = useHistory();
//! Check Authenticated after Component does Mount
useEffect(() => {
if (isAuthenticated() && isAuthenticated().role === 1) {
//! Redirect to Admin dashboard
history.push('/admin/dashboard');
} else if (isAuthenticated() && isAuthenticated().role === 0) {
//! Redirect to User dashboard
history.push('/user/dashboard');
}
}, [history]);
const [formData, setFormData] = useState({
username: "",
email: "",
password: "",
errorMsg: false,
loading: false
});
const { username, email, password, errorMsg, loading } = formData;
const handleSubmit = (e) => {
e.preventDefault();
//! client validation
if (isEmpty(email) || isEmpty(password)) {
setFormData({...formData, errorMsg: "Enter your information"});
} else if (!isEmail(email)) {
setFormData({...formData, errorMsg: "Email invalid"});
} else {
setFormData({...formData, loading: true});
// Send data to server
const data = { user : { email, password } };
signin(data) //! return response
.then(response => {
setAuthentication(response.data.token, response.data.user);
if (isAuthenticated() && isAuthenticated().role === 1) {
//! Redirect to Admin dashboard
history.push('/admin/dashboard');
} else {
//! Redirect to User dashboard
history.push('/user/dashboard');
}
setFormData({
...formData,
loading: false,
});
})
.catch(error => {
setFormData({
...formData,
loading: false,
errorMsg: error.response.data.errorMessage
});
});
}
}
const handleChange = (e) => {
setFormData({
...formData,
[e.target.name]: e.target.value,
errorMsg: ""
});
}
// View
const showSigninForm = () => (
<form className="signin-form" onSubmit={handleSubmit} noValidate>
<h4 className="d-flex justify-content-center mb-4">Đăng nhập</h4>
{/* email */}
<div className="form-group input-group">
<div className="input-group-prepend">
<span className="input-group-text">
<i className="fa fa-envelope"></i>
</span>
</div>
<input
type="email"
name="email"
value={email}
onChange={handleChange}
className="form-control"
placeholder="Email address"
/>
</div>
{/* password */}
<div className="form-group input-group">
<div className="input-group-prepend">
<span className="input-group-text">
<i className="fa fa-lock"></i>
</span>
</div>
<input
type="password"
name="password"
value={password}
onChange={handleChange}
className="form-control"
placeholder="Password"
/>
</div>
{/* submit */}
<button type="submit" className="btn btn-primary btn-block">Đăng nhập</button>
<p className="forgot-password text-right" style={{color: 'white'}}>
Bạn chưa có tài khoản?
<Link to="/signup" className="ml-2">Đăng ký</Link>
<Link to="/password" className="ml-2">Quên mật khẩu</Link>
</p>
</form>
);
return (
<div className="signin-container">
<div className="row px-4 vh-100">
<div className="signin-form col-sm-8 col-md-6 mx-auto">
{loading && (
<div className="text-center">
{showLoading()}
</div>
)
}
{errorMsg && showErrorMsg(errorMsg)}
{showSigninForm()}
</div>
</div>
</div>
);
};
export default Signin;
解决方案
你只需要在 useEffect 中进行清理,我认为可以摆脱这个错误。
useEffect(() => {
let isMounted = true; // note mutable flag
if (isAuthenticated() && isAuthenticated().role === 1) {
//! Redirect to Admin dashboard
history.push('/admin/dashboard');
} else if (isAuthenticated() && isAuthenticated().role === 0) {
//! Redirect to User dashboard
history.push('/user/dashboard');
}
return () => { isMounted = false }; // cleanup toggles value, if unmounted
}, [history]);
推荐阅读
- node.js - Nodejs + firebase:无法删除多个文档
- python - Matplotlib 中的 DLL 文件问题
- python - 如何将下拉查询包含到 HttpResponse 视图中
- opencv - 无法从图像中获取文本
- node.js - 如何使用 Firebase Admin Node JS SDK 从 Firebase 取消链接电子邮件
- java - 基于 HttpSession 限制 WebSocket 广播的目标
- go - googles API Linter 的原型文件代表什么?
- amazon-emr - Amazon EMR - 端口 9443 上缺少来自 EmrManagedMasterSecurityGroup 的入口规则
- javascript - 如何在 datetime-local TextField 中禁用距当前日期超过 1 年的日期
- javascript - 如何在 SparkAR 工作室中发出 GET 请求