Реагировать на удаление товаров из корзины по индексу с помощью хука useCallback
Я пытаюсь добавить функцию, которая удаляет элемент из компонента корзины покупок, щелкнув onClick, который запускает функцию removeProductFromCartAtIndex useCallback. До сих пор мне удалось успешно добавить товары в корзину, но когда я использую onClick для удаления, он удаляет весь массив корзины покупок.
Я хотел бы удалить товары из корзины в индексе, используя хук useCallback
Я чувствую, что неправильно обновляю состояние. Я знаю, что было бы проще, если бы я отфильтровал фактический идентификатор элемента вместо индекса, я пытаюсь понять, как я могу фильтровать массив с помощью индекса.
Заранее спасибо за любую помощь или совет!
файл context.js:
const [shoppingCart, setShoppingCart] = React.useState([]);
const removeProductFromCartAtIndex = React.useCallback((index) => {
setShoppingCart(shoppingCart.filter((item, i) => i !== index
}, []);
файл shopping-cart.js:
const ShoppingCart = () => {
const {shoppingCart, actions} = useContext(AppContext)
return (
<div className="shopping-cart">Shopping Cart
<ul>
{shoppingCart.map((item, index) => (
<li key={index}>
<span className='count'>1</span>
<span>{item.name}</span>
<span>$0.00</span>
<button onClick={() => {actions.removeProductFromCartAtIndex(index)}}><VscTrash /></button></li>
))}
</ul>
1 ответ
Есть две вещи, которые вам нужно исправить:
- Добавлять
setShoppingCart
как зависимость отuseCallback
. - Используйте обновление функционального состояния.
Итак, ваш код должен выглядеть так:
const removeProductFromCartAtIndex = React.useCallback((index) => {
setShoppingCart(currentShoppingCart => currentShoppingCart.filter((item, i) => i !== index
}, [setShoppingCart]);
В общем, когда вы обновляете переменную состояния, а новое значение состояния зависит от предыдущего значения, вы хотите использовать обновление функционального состояния. В противном случае вы рискуете использовать устаревшее значение.