Я все еще немного новичок, чтобы реагировать и как это работает. Я пытаюсь создать список покупок из списка рецептов, которые представляют собой объекты, содержащие массив ингредиентов, но реагирующие отображают только 1-й элемент и отображают другие элементы после каждого щелчка.
вот мой код:
import { useState } from 'react';
import { MealContext } from '../../../Context/MealContext';
import GroceryListComponent from './GroceryListComponent';
const GrocerysListContainer = () => {
const [selectedMeals,setMeals] = useContext(MealContext);
const [groceryList, setGroceryList]= useState([]);
const [showList,setShowList] = useState(false);
const handleClick = ()=>{
setShowList(true);
selectedMeals.forEach(meal => {
meal.ingredient.forEach((dish)=>{
if (!groceryList.find(({name})=>name === dish.toLowerCase())){
setGroceryList([...groceryList, {name : dish.toLowerCase(), qty : 1}]);
console.info('add')
}else{
console.info('remove')
return;
}
})
});
}
return (
<div className = "groceryList">
<button className = "btn btn-submit" onClick = {()=>handleClick()}>Creer liste de course</button>
{showList && <ul>
{ groceryList.map((grocery,index)=>{
return(
<GroceryListComponent
key = {index}
grocery = {grocery}
/>
)
})
}
</ul>}
</div>
);
};
export default GrocerysListContainer;
Скорее всего, productList не обновляется в функции, поэтому это поможет добавить новые элементы в массив, а затем, наконец, добавить их.
Быстрая починка
setGroceryList(list => [...list, {name : dish.toLowerCase(), qty : 1}]);
Чтобы перейти к улучшенному решению, необходимо также обновить количество существующего товара.
const handleClick = () => {
// can include try catch
setShowList(true);
let newList = []
for (const meal of selectedMeals) {
// include check with ?. and ??
const ingredient = meal.ingredient;
// can add another loop here
const dish = ingredient.find(dish => !groceryList.find(({ name }) => name === dish.toLowerCase()))
if (!dish) {
newList.push({ name : dish.toLowerCase(), qty : 1})
} else {
// depends on what you want to achieve
// increase qty or something
}
}
setGroceryList([ ...groceryList, ...newList ])
}
Надеюсь, это поможет вам как-то
Ваше здоровье