Повторная выборка данных с сервера с помощью react, redux toolkit и useEffect

Есть код который при добавлении избранного товара добавляет его на сервер.Для обновления данных на странице я создал отдельный refetch файл в котором простая логика редакса, откуда достаются данные и помещаются в зависимость useEffect.Можно ли как то упростить зависимости для обновления данных или такой подход подойдет?

Тут достаются данные с бд избранное

Favorite.tsx

interface IFavorite {
    openFavorite: boolean,
    setOpenFavorite: (value: boolean) => void;
}

const Favorite: React.FC<IFavorite> = ({openFavorite, setOpenFavorite}) => {

    const { favoriteList } = useAppSelector(refetch);

    const dispatch = useAppDispatch();

    const favoriteItems = useAppSelector(favoriteItem);

    useEffect(() => {
        dispatch(favoriteFetch());
    },[favoriteList]);

    return (
        <div className={`${styles.favorite} ${openFavorite ? styles.active : ''}`}>
                                    <div className={styles.favoriteHead}>
                                        <div className={styles.favoriteHeadTitle}>Избранное</div>
                                        <div onClick={() => setOpenFavorite(false)} className={styles.favoriteHeadClose}>X</div>
                                    </div>
                                    <div className={styles.favoriteTd}>
                                    {favoriteItems.length <= 0 
                                        ? <div className={styles.favoriteTdEmpty}>
                                            Нет избранных товаров
                                        </div>
                                        : favoriteItems.map(item => <FavoriteProduct key={item.id} id={item.id} img={item.img} title={item.title} price={item.price}/>)}
                                    </div> 
                                </div>
    )
};

export default Favorite;

Тут товары добавляются в избранное Products.tsx

interface IProduct {
    id: string,
    img: string,
    title: string,
    price: number,
}

const Products: React.FC<IProduct> = ({id, img, title, price}) => {

    const favorite = useAppSelector(favoriteList(id));
    const cart = useAppSelector(cartList(id));

    const props = {id, img, title, price};

    const dispatch = useAppDispatch();

    const handleFavorite = () => {
        dispatch(addFavoriteRefetch({id, img, title, price}));
        
        if(favorite){
            dispatch(deleteFavoriteFetch(id))
        } else {
            dispatch(addFavoriteFetch(({id, img, title, price})))
        }     
    }

    const handleCart = () => {
        dispatch(addCartRefetch({id, img, title, price}))

        if(cart) {
            dispatch(updateCartFetch(cart));    
        } else {
            dispatch(addCartFetch({...props, count: 1}));
        }
        
    }
    
    return (
        <div className={styles.contentProducts}>
            <img onClick={handleFavorite} className={styles.contentProductsFavorite} src={favorite ? '/images/heartclick.png' : "/images/heart.png"} alt="" />
            <img className={styles.contentProductsImg} src={img} alt="" />
            <div className={styles.contentProductsOptions}>
                <div>
                    <p>{title}</p>
                    <div>Цена: {price} р.</div>
                </div>
                <button onClick={handleCart}>Добавить</button>  
            </div>
            
        </div>
    )
}

export default Products

Тут серверные запросы favoriteSlice.tsx

export const favoriteFetch = createAsyncThunk<IFavorite[]>(
    'favorite/favoriteFetch',
    async () => {
        const {data} = await axios.get<IFavorite[]>('http://localhost:3001/favorite');
        return data;
    }
) 

export const addFavoriteFetch = createAsyncThunk(
    'addFavorite/addFavoriteFetch',
    async (params: IFavorite) => {
        await axios.post('http://localhost:3001/favorite', params);
    }
)

export const deleteFavoriteFetch = createAsyncThunk(
    'deleteFavorite/deleteFavoriteFetch',
    async (id: string) => {
        await axios.delete(`http://localhost:3001/favorite/${id}`)
    }
)

const enum Status {
    LOADING = 'Loading',
    SUCCES = 'completed',
    ERROR = 'error',
}

interface IFavorite {
    id: string,
    img: string,
    title: string,
    price: number,
}

interface IFavorites {
    list: IFavorite[],
    status: Status,
}

const initialState: IFavorites = {
    list: [],
    status: Status.LOADING,
}

export const favoriteSlice = createSlice({
    name: 'favorite',
    initialState,
    reducers: {

    },
    extraReducers: (builder) => {
        builder.addCase(favoriteFetch.pending, (state) => {
            state.status = Status.LOADING;
        });
        builder.addCase(favoriteFetch.fulfilled, (state, action) => {
            state.list = action.payload;
            state.status = Status.SUCCES;
        });
        builder.addCase(favoriteFetch.rejected, (state) => {
            state.status = Status.ERROR;
        });
    },
});

export default favoriteSlice.reducer


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