#reactjs #react-native #use-effect
#reactjs #react-native #использование-эффект
Вопрос:
Я пытался использовать функцию очистки для отмены вызова API, когда пользователь нажимает кнопку «Назад» до разрешения запроса. Однако я все еще получаю ту же ошибку «Предупреждение: не удается выполнить обновление состояния реакции для размонтированного компонента.». Я использую функцию выборки, я добавил AbortController, но все равно получаю то же предупреждение.
import React, { useState, useEffect, useReducer, useContext } from "react";
import { ActivityIndicator } from "react-native";
import AllThumbnails from "../components/AllThumbnails";
import reducer from "../functions/reducer";
import { lightColors, darkColors } from "../constants/Colors";
import { ThemeContext } from "../context/context";
import ScreenContainer from "../components/UI/ScreenContainer";
export default function AllCatScreen(props) {
const { navigation, route } = props;
const [categories, setCategories] = useState([]);
const [state, dispatch] = useReducer(reducer, { catPage: 1 });
const [theme] = useContext(ThemeContext);
const { taxonomy } = route.params;
useEffect(() => {
const abortCtrl = new AbortController();
const opts = { signal: abortCtrl.signal };
let isActive = true;
fetch(`${siteURL}/wp-json/wp/v2/${taxonomy.endPoint}`, opts)
.then((response) => response.json())
.then((res) => {
if (isActive) {
setCategories([...categories, ...res]);
}
})
.catch((err) => console.log(err));
return function cleanup() {
isActive = false;
console.log(isActive);
abortCtrl.abort();
};
}, []);
if (categories.length == 0) {
return (
<ScreenContainer notYet={true}>
<ActivityIndicator size="large" color={theme.colors.text} />
</ScreenContainer>
);
} else {
return (
<ScreenContainer notYet={false}>
<AllThumbnails
data={categories}
navigation={navigation}
catThumb={true}
action={[state, dispatch]}
fetchData={fetchData}
/>
</ScreenContainer>
);
}
}
Я читал, что react native должен поддерживать AbortController. Я использую Expo SDK 38, но даже при регистрации функции очистки консоль не работает. Кто-нибудь знает, что не так?
Комментарии:
1. Здесь происходит что-то действительно странное — вам вообще не нужно
AbortController
для подавления предупреждения. Минимальный пример (с предупреждением, подавленным функцией очистки): codesandbox.io/s/elated-torvalds-xzqer?file=/src/App.js Можете ли вы опубликовать полный код компонента?2. Хорошо, я обновил код в сообщении.
3. По-прежнему не вижу ничего, что могло бы вызвать это предупреждение. Вы уверены, что это происходит из этого компонента? Что такое трассировка стека?
4. Предупреждение срабатывает, когда я перехожу к экрану, затем после перехода к экрану я нажимаю кнопку «Назад» до завершения запроса API.
5. Это происходит только на основе описанного выше поведения, а не в общем случае.