Функция очистки эффекта использования, не вызываемая react native

#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. Это происходит только на основе описанного выше поведения, а не в общем случае.