Я написал пользовательскую ловушку React, которая использует jQuery для извлечения результатов по заданному URL-адресу через AJAX (это в контексте унаследованного приложения, поэтому необходимо использовать jQuery для AJAX ), API для которого слабо вдохновлен ax ios -hooks . Код для этого выглядит следующим образом (обратите внимание, что он включает аннотации потока):
//@flow
import { useCallback, useState, useEffect } from "react";
import type { jquery } from "jquery";
declare var $: jquery;
function useAjaxGet(url: string) {
const [loading, setLoading] = useState(true);
const [data, setData] = useState(null);
const [error, setError] = useState(null);
const fetchData = useCallback(() => {
setLoading(true);
$.ajax({
type: "GET",
url: url,
dataType: "json"
}).done((data) => {
setData(data);
setLoading(false);
setError(false);
}).fail(() => {
setLoading(false);
setError(true);
});
}, [url]);
useEffect(() => {
fetchData();
}, [url, fetchData]);
return [{
data: data,
loading: loading,
error: error
}, fetchData];
}
export default useAjaxGet;
Теперь это работает для простых приложений, но рано или поздно выдает следующую ошибку:
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.
Я понимаю тот факт, что я должен вернуть функцию очистки, и что отказ сделать это вызывает утечку памяти. Тем не менее, я изо всех сил пытаюсь понять, что я могу сделать, чтобы разобраться в этом деле. Кто-нибудь может пролить свет на это?