Как при использовании фильтров менять отрисовку массива элементов?

У меня есть массив finalProducts,в который я записываю из state уже отсортированный массив.

const state = useSelector(state => state.products)
let finalProducts = [];
const [items, setItems] = useState([]) 

Здесь происходит сама сортировка

switch(state.filter.type){ // из стате получаю фильтр и на основе его данных сортирую
        case "function":
            finalProducts = state.filter.criteria.action.call( //присваюваю finalProducts отсортированный массив
                [...state.products],
                state.filter.criteria.discerner
            );
            break;
        case "property":
            let criteria = state.filter.criteria;
            if(criteria.value instanceof Array){
                finalProducts = state.products.filter(item => criteria.value.includes(item[criteria.prop]))
            }
            else if(criteria.prop && criteria.value){
                finalProducts = state.products.filter(item=>item[criteria.prop]==criteria.value);
            }else{
                finalProducts = state.products;
            }    
            break;
    }

У меня массив должен быть отсортированным, а так же должна присутствовать динамическая пагинация.

useEffect(() => {
    if(fetching){ // подгружаю элементы
        setItems([...finalProducts.slice(0, total)]);
        setStartPage(total)
        setTotal(total+total);
        setFetching(false);
    }
    
}, [fetching])

useEffect(()=>{
    document.addEventListener('scroll', scrollHandler);

    return function(){
        document.removeEventListener('scroll', scrollHandler)
    };
}, [])

useEffect(() => {
    setItems([...finalProducts.slice(0, total)]);
    
}, [finalProducts]) // **ругается на эту зависимость**

и выводит я уже буду массив items

return (
    <div className="container" >
            {items.map(product => 
                    <div key={product.id} className="product">
                        <div>{product.name}</div>
                        <div><img src={product.img} /></div>
                    <div>{product.brand} {product.price}</div>
                </div>  
            )}
    </div>
)

Все отлично работает, фильтры применяются, пагинация работают. Только в консоли выдается ошибка введите сюда описание изображения

И ругается он из-за того, что я в зависимости useEffect передала finalProducts. Но ведь это логично, что при каждом изменения finalProducts должна меняться отрисовка. Я пробовала передавать в зависимости useEffect state.filter(то есть когда меняется фильтр, перерисовывать), но так он работает некорректно. Как правильно передать зависимости? Чтобы отображались правильные данные.


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