在 React 功能组件中取消异步请求的正确方法是什么?
我有一个脚本,它在加载时(或在某些用户操作下)从 API 请求数据,但是如果正在执行此过程并且用户导航离开,则会导致以下警告:
警告:无法对卸载的组件执行 React 状态更新。这是一个空操作,但它表明您的应用程序中存在内存泄漏。要修复,请取消 useEffect 清理函数中的所有订阅和异步任务。
我读过的大部分内容都使用基于类的组件AbortController
的componentDidUnmount
方法解决了这个问题。而我的 React 应用程序中有一个功能组件,它使用 Axois 向 API 发出异步数据请求。
该函数驻留在useEffect
功能组件中的一个钩子中,以确保该函数在组件呈现时运行:
useEffect(() => {
loadFields();
}, [loadFields]);
这是它调用的函数:
const loadFields = useCallback(async () => {
setIsLoading(true);
try {
await fetchFields(
fieldsDispatch,
user.client.id,
user.token,
user.client.directory
);
setVisibility(settingsDispatch, user.client.id, user.settings);
setIsLoading(false);
} catch (error) {
setIsLoading(false);
}
}, [
fieldsDispatch,
user.client.id,
user.token,
user.client.directory,
settingsDispatch,
user.settings,
]);
这是触发的 axios 请求:
async function fetchFields(dispatch, clientId, token, folder) {
try {
const response = await api.get(clientId + "/fields", {
headers: { Authorization: "Bearer " + token },
});
// do something with the response
} catch (e) {
handleRequestError(e, "Failed fetching fields: ");
}
}
注意:api
变量是对axios.create
对象的引用。