Задать вопрос
@SLien

Как не вызывать получения данных из redux много раз?

Смотрите вот мой код:
import React, { useEffect, useState } from 'react'
import { useDispatch, useSelector } from 'react-redux'
import { getCategories } from '../../store/reducers/categories'
import { deleteGoods, getGoods } from '../../store/reducers/goods'
import './Items.scss'
import ItemsPopup from './ItemsPopup/ItemsPopup'
import ItemsRow from './ItemsRow'

const Items = () => {
	const [popupIsOpen, setPopupIsOpen] = useState(false)
	const [fastIsOpen, setFastIsOpen] = useState(false)
	const [selectedItems, setSelectedItems] = useState([])
	const [categoryData, setCategoryData] = useState([])
	const [goodsData, setGoodsData] = useState([])

	const goods = useSelector(s => s.goods)
	const users = useSelector(s => s.user)
	const categories = useSelector(s => s.categories)
	const dispatch = useDispatch()

	useEffect(() => {
		dispatch(getGoods())
		dispatch(getCategories())

		if (goods.status === 'success') {
			setGoodsData(
				goods?.data.filter(item => {
					return item.owner_id === users.user.owner_id
				})
			)
		}

		setCategoryData(
			categories.data.filter(item => {
				return item.owner_id === users.user.owner_id
			})
		)
	}, [goods.data])

	const handleSelectAll = () => {
		if (goodsData.length === 0) return

		if (selectedItems.length === goodsData.length) {
			setSelectedItems([])
		} else {
			setSelectedItems(goodsData.map(product => product.id))
		}
	}

	const handleSelectItem = id => {
		setSelectedItems(prev =>
			prev.includes(id) ? prev.filter(item => item !== id) : [...prev, id]
		)
	}

	const handleDeleteSelected = () => {
		selectedItems.forEach(id => dispatch(deleteGoods(id)))
		setSelectedItems([])
	}

	return (
		<div className='add'>
			<div className='add__top'>
				<h1 className='add__top__title'>Товары</h1>

				<div className='add__top__btns'>
					{/* <button
						className='add__top__btn'
						onClick={() => setFastIsOpen(!fastIsOpen)}
					>
						+ Быстрое добавление
					</button> */}

					<button
						className='add__top__btn'
						onClick={() => setPopupIsOpen(!popupIsOpen)}
					>
						+ Добавить новый
					</button>

					{selectedItems.length > 0 && (
						<button className='add__top__btn' onClick={handleDeleteSelected}>
							Удалить выбранные ({selectedItems.length})
						</button>
					)}
				</div>
			</div>
			<div className='add__content'>
				<div className='add__content__table'>
					<div className='add__content__table__header'>
						<div className='add__content__table__header__cell'>
							<input
								type='checkbox'
								checked={
									goodsData.length > 0 &&
									selectedItems.length === goodsData.length
								}
								onChange={handleSelectAll}
								disabled={goodsData.length === 0}
							/>
						</div>
						<div className='add__content__table__header__cell'>Ид</div>
						<div className='add__content__table__header__cell'>Штрихкод</div>
						<div className='add__content__table__header__cell'>Название</div>
						<div className='add__content__table__header__cell'>Категория</div>
						<div className='add__content__table__header__cell'>
							Цена прибытия
						</div>
						<div className='add__content__table__header__cell'>
							Цена продажи
						</div>
						<div className='add__content__table__header__cell'>Количество</div>
						<div className='add__content__table__header__cell'>Действия</div>
					</div>
					<div className='add__content__table__body'>
						{goodsData.map(product => (
							<ItemsRow
								key={product.id}
								product={product}
								isSelected={selectedItems.includes(product.id)}
								onSelect={handleSelectItem}
								goods={goodsData}
								categories={categoryData ? categoryData : []}
							/>
						))}

						{goodsData.length === 0 && (
							<div className='add__content__table__empty'>Нет товаров</div>
						)}
					</div>
				</div>
			</div>

			<ItemsPopup
				popupIsOpen={popupIsOpen}
				setPopupIsOpen={setPopupIsOpen}
				goods={goodsData}
				categories={categoryData ? categoryData : []}
				user={users.user}
			/>

			{/* <ItemsFastPopup
				fastIsOpen={fastIsOpen}
				setFastIsOpen={setFastIsOpen}
				goods={goodsData}
			/> */}
		</div>
	)
}

export default Items


Суть в том что я вызываю getGoods и допустим добавляю еще один товар надо его обновлять что бы новые данные вышли сразу а если делать как я то он вызывается по много раз и сайт начинает лагать.
Еще можете дать советы по коду?
  • Вопрос задан
  • 99 просмотров
Подписаться 1 Простой 5 комментариев
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы