#reactjs #redux #react-redux
#reactjs #redux #реагировать-redux
Вопрос:
В редукторе Redux мне нужно уменьшить количество товара внутри массива cart, если количество товара больше 1. Если это ровно 1, весь объект должен быть отфильтрован из этого массива. Как этого добиться?
Reducer.js
const INITIAL_STATE = {
cart: []
};
const shopReducer = (state = INITIAL_STATE, { type, payload }) => {
switch (type) {
case "SUB_QUANTITY":
console.log("Cart", state.cart)
return {
...state,
cart: state.cart.map((product) => product.id === payload ?
{ ...product, count: product.count - 1 } : { ...product })
}
default:
return state;
}
};
Приведенный выше код будет уменьшать количество до 0,-1,-2. Я пытаюсь product.count===1 ? filter(......) : the code mentioned in the reducer
. Но это дает пустой массив внутри массива cart, если количество = 1. Как я могу использовать метод фильтра внутри метода карты?
Ответ №1:
Проверьте приведенный ниже код. Сначала я уменьшаю количество правильных элементов, а затем отфильтровываю его, если количество меньше 1.
const INITIAL_STATE = {
cart: []
};
const shopReducer = (state = INITIAL_STATE, { type, payload }) => {
switch (type) {
case "SUB_QUANTITY":
console.log("Cart", state.cart)
// reduce the quantity
const updated = state.cart.map((product) => {
if(product.id === payload) {
product.count = product.count - 1
}
})
// return items that have count higher than 0
const filtered = updated.filter((product) => (
product.count > 0
))
return {
...state,
cart: filtered
}
default:
return state;
}
};
Ответ №2:
Я решил это путем условного рендеринга во внешнем интерфейсе. Для количества 0 я вызываю removecart(), иначе я вызываю subQuantity()
const handleDecrement = () => {
cart.map((product: any) => product.id === item.id amp;amp;
product.count > 1 ? subQuantity(item.id) : removeFromCart(item.id))
}