javascript - React - 修复,取消 useEffect 清理函数中的所有订阅和异步任务
问题描述
我有以下代码
const Companies = () => {
const [company, setCompany] = useState(plainCompanyObj);
const [companiesData, setCompaniesData] = useState([]);
useEffect(() => {
Call<any, any>({
url:
_baseApiUrl +
"-------api goes here --------",
method: "GET",
data: null,
success: (companies) => {
setCompaniesData(companies.companies);
},
authorization: sessionStorage.getItem("accessToken"),
});
}, []);
return (
//return JSX
);
};
我收到以下错误:Warning: Can't perform a React state update on an unmounted component. This is a no-op, but it indicates a memory leak in your application. To fix, cancel all subscriptions and asynchronous tasks in a useEffect cleanup function.
也只是为了澄清Call
标签是axios
我用于 URL 错误处理程序等的导入方法。错误提示的问题在该useEffect
部分中。
解决方案
您的问题是您setCompaniesData
在组件已卸载时调用。所以你可以尝试使用取消令牌来取消 axios 请求。
https://github.com/axios/axios#cancellation
const Companies = () => {
const [company, setCompany] = useState(plainCompanyObj);
const [companiesData, setCompaniesData] = useState([]);
useEffect(() => {
const cancelTokenSource = axios.CancelToken.source();
Call<any, any>({
url:
_baseApiUrl +
"-------api goes here --------",
method: "GET",
data: null,
cancelToken: cancelTokenSource.token
success: (companies) => {
setCompaniesData(companies.companies);
},
authorization: sessionStorage.getItem("accessToken"),
});
}, []);
return () => {
cancelTokenSource.cancel();
}
};
第二个选项是跟踪组件的已安装状态,并且仅在组件仍已安装时才调用 setState。在此处查看此视频:https ://www.youtube.com/watch?v=_TleXX0mxaY&ab_channel=LeighHalliday
推荐阅读
- java - Java SWIG 包装器与直接函数调用
- php - 如何在 PHP EvTimer 中捕获致命错误
- java - 为什么eclipse说我的方法没有返回有效结果?
- c# - “http://localhost/Identity/account”可以访问,但在我的项目中没有。为什么存在,我该如何摆脱它?
- asp.net-core-webapi - ASP.NET Core 2.1 中间件返回 404
- javascript - 加载内容时的角度加载动画
- php - 在 Laravel 之外获取 Laravel 会话数据(Memcached)
- python-2.7 - 嵌套循环读取文件
- java - Jetty maven 插件 9.4.12 和 Java 11
- javascript - 使用Javascript从字符串中删除部分单词