Появился бесконечный цикл в компоненте React js

Я догадываюсь, что это из-за useEffect, но решить не получается. Этот код отвечает за работу компонента корзины в интернет-магазине и он бесконечно отправляет запросы на сервер. Как можно решить?

import React, {useCallback, useEffect} from "react";
import Cart from "./Cart";
import {useDispatch, useSelector} from "react-redux";
import {deleteCartTC, getCartsTC} from "../../store/thunks/thunkCreators";
import {getToken} from "../../customProvider/tokenProvider";


const CartContainer = (props) => {

    const dispatch = useDispatch()
    const carts = useSelector((state) => state.cart.carts)
    const cartsProducts = useSelector((state) => state.cart.cartsProducts)
    const userToken = getToken()

    useEffect(() => {
        dispatch(getCartsTC(userToken.value))
    }, [carts]);

    // Удаление товара с корзины и ее обнавление
    const deleteCart = async (cart_id) => {
        try {
            await dispatch(deleteCartTC(userToken.value, cart_id))
            // После успешного удаления, повторно получаем корзины
            await dispatch(getCartsTC(userToken.value))
        } catch (error) {
            console.error('Ошибка при удалении корзины:', error)
        }
    }

    return <Cart carts={carts} cartsProducts={cartsProducts} deleteCart={deleteCart}/>

}


export default CartContainer

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

Автор решения: Anatoly

Проблема здесь связана с тем, что вы используете carts в зависимостях useEffect, и каждый раз, когда состояние carts изменяется, будет запускаться новый эффект. Однако, внутри эффекта, вы изменяете carts снова с помощью dispatch(getCartsTC(userToken.value)), что ведет к новому запуску эффекта, создавая бесконечный цикл. Попробуйте так:

const fetchCarts = useCallback(async () => {
        try {
            await dispatch(getCartsTC(userToken.value));
        } catch (error) {
            console.error('Ошибка при получении корзин:', error);
        }
    }, [dispatch, userToken.value]);

// Вызываем fetchCarts при монтировании компонента
useEffect(() => {
        fetchCarts();
    }, [fetchCarts]);

const deleteCart = async (cart_id) => {
        try {
            await dispatch(deleteCartTC(userToken.value, cart_id));
            // После успешного удаления, повторно получаем корзины
            fetchCarts();
        } catch (error) {
            console.error('Ошибка при удалении корзины:', error);
        }
    };

Должно помочь. Если нет, то нужно больше данных...

→ Ссылка