Здравствуйте, у меня есть массив 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;