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

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

Здравствуйте, у меня есть массив pizzas и его апдейтер функция setPizzas, которые находится в главном компоненте App:

код App:

const App = () => {
    const [pizzas, setPizzas] = React.useState<Pizza[]>([]);
    const [cart, setCart] = React.useState<Cart[]>(parseJSON("cart") ?? []);
    const [loading, setLoading] = React.useState<boolean>(true);
    const [errorData, setErrorData] = React.useState<Error | unknown>(null);

    React.useEffect(() => {
        (async () => {
            try {
                const { data } = await api.getPizzas();
                setPizzas(data);
            } catch (error) {
                console.error(error);
                setErrorData(error);
            } finally {
                setLoading(false);
            }
        })();
    }, []);

    React.useEffect(() => localStorage.setItem("cart", JSON.stringify(cart)), [cart]);

    if (errorData || (!loading && !pizzas.length)) {
        return (
            <NotFound
                title='Не удалось получить данные с сервера'
                description='Пожалуйста, проверьте свое соединение с интернетом и обновите страницу'
                reloadButton
                screen
            />
        );
    }

    return (
        <AppContext.Provider value={{ loading, errorData, pizzas, setPizzas, cart, setCart }}>
            <Routing />
        </AppContext.Provider>
    );
};

export default App;


Помимо этого у меня есть компонент CategoriesList, который содержит в себе список категорий. Я пытаюсь реализовать простую фильтрацию по нажатию на конкретную категорию, как видно в примере ниже я попробовал сделать фильтрацию на основе предыдущего стейта, но это неправильно, так-как это отработает только 1 раз и pizzas будет хранить в себе элементы только с одной категорией. Мне нужно обновлять pizzas, но при этом сохранять все его элементы ( я правда не знаю как это сделать и не могу до конца сформулировать правильно ).

код CategoriesList:

const CategoriesList: React.FC<Props> = ({ categories }) => {
    const { setPizzas } = React.useContext(AppContext);

    const [selectedCategorie, setSelectedCategorie] = React.useState(parseJSON(CATEGORIE_KEY) ?? 0);

    const handleClick = (index: number, categorie: number) => {
        setSelectedCategorie(index);
        saveToLocalStorage({ key: CATEGORIE_KEY, data: index });

        setPizzas((prevState) => prevState.filter(({ category }) => category === categorie));
    };

    return (
        <ul className='flex items-center justify-start gap-[30px]'>
            {categories.map(({ name, categorie }, index) => (
                <CategorieItem {...{ key: name, categorie, handleClick, index, name, selectedCategorie }} />
            ))}
        </ul>
    );
};

export default CategoriesList;
  • Вопрос задан
  • 155 просмотров
Подписаться 1 Простой 7 комментариев
Решения вопроса 1
miraage
@miraage
Старый прогер
А зачем хранить отфильтрованные пиццы? Какие-то проблемы с производительностью?
По текущему коду складывается ощущение, что ререндер будет происходить только при смене категории.
Можно спокойно написать categires.filter(...).map(...), вместо попыток построить звезду смерти.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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