Как исправить некорректное поведение программы в режиме StrictMode?

У меня проблема в режиме StrictMode. Написал кастомный хук для intersection observer, чтобы отображать карточки по несколько товаров и загружать товары при прокрутке страницы. И каждый раз, когда происходит пересечение в intersection observer, выполняется запрос на сервер и подгружаются товары. Но в режиме StrictMode в компоненте Main, где я использую этот кастомный хук, товары в массиве дублируются и состояние skip, которое отвечает за количество товаров, которое нужно пропустить от начала, работает некорректно. Код привожу ниже:

Файл hooks.ts:

export const useScroll = (
        parentRef: any,
        childRef: any,
        isLoading: boolean,
        callback: any
    ) => {
    useEffect(() => {
        const options = {
            root: parentRef.current,
            rootMargin: "0px",
            threshold: 0,
        };

        const observer = new IntersectionObserver(([target]) => {
            if (target.isIntersecting && !isLoading) {
                callback();
            }
        }, options);

        observer.observe(childRef.current);

        return () => {
            childRef.current && observer?.unobserve(childRef.current);
        };
    }, [callback]);
};

Файл Main.tsx:

export const Main: React.FC = (): React.JSX.Element => {
    const [products, setProducts] = useState<ProductType[]>([]);
    const [isLoading, setIsLoading] = useState(false);
    const [skip, setSkip] = useState<number>(0);
    const parentRef = useRef<HTMLDivElement>(null);
    const childRef = useRef<HTMLDivElement>(null);

    const productFetching = useCallback(() => {

        if (!isLoading) {
            setIsLoading(true);
            fetch(`https://dummyjson.com/products?limit=6&skip=${skip * 6}`)
                .then((response) => response.json())
                .then((data) => {
                    setProducts((prevProducts) => [
                        ...prevProducts,
                        ...data.products,
                    ]);
                    console.log("[skip]: ", skip, isLoading);
                    setSkip(skip + 1);
                })
                .finally(() => setIsLoading(false));
        }
    }, [isLoading, skip]);

    useScroll(parentRef, childRef, isLoading, productFetching);

    return (
        <div className="main">
            <div className="container">
                <Header />
                <div className="products" ref={parentRef}>
                    {products.map((product) => {
                        return <Card key={product.id} {...product} />;
                    })}
                    <div
                        className="child"
                        ref={childRef}
                        style={{
                            width: "100%",
                            height: "20px",
                            background: "black",
                        }}
                    ></div>
                </div>
            </div>
        </div>
    );
};

Если убрать StrictMode, то все работает правильно. Как это можно исправить, уже что только не пробовал, но никак не получается. Помогите, пожалуйста, разобраться


Ответы (0 шт):