@Deadorik

Почему редюсер не работает как ожидалось?

Всем привет. В редюсер добавляется товар. Количество единиц считается корректно. Проблема с подсчетом цены, вроде написано логично количество товара * стоимость одной единицы. Однако, происходит задержка изменения состояния и появляются неадекватные цифры. Изначально грешил на асинхронное обновления состояния. Опытным путем понял что я мутирую массив, если добавлять фиксированное число +1000, то все работает как часы. Почему так и как это исправить?

Редюсер
import {ADD_PRODUCT} from "./case";

const defaultState = {
    products: []
}
// Редюсер для добавления товара в корзину
export const inCartReducer = (state = defaultState, action) => {
    switch (action.type) {
        case ADD_PRODUCT:
            const item = state.products.find(n => n.id === action.payload.id);
            return {
                ...state,
                products: item
                    ? state.products.map(n => n === item ? {...n, count: n.count + 1, price: n.price+1000} : n)
                    : [...state.products, {...action.payload, count: 1}]
            };
        default:
            return state
    };
};

// Чтение
const stateItem = {
    items: [
        {
            id: 1,
            img: "./source/popular/game_img1.jpg",
            price: 1190,
            old_price: "1980 ₽",
            sale: -31,
            description: "Взрывные ящерицы. Безумие, апокалипсис и хвостики",
        }
    ]
}


Диспатч
const dispath = useDispatch();
    const productCart = useSelector(state => state.inCart.products);


    // Добавление продукта в корзину
    const cart = (product) => {
        dispath(addInCart(product));
    }
  • Вопрос задан
  • 78 просмотров
Пригласить эксперта
Ответы на вопрос 1
@veryshake
попробуй для начала упростить...
const itemIndex = state.products.findIndex(n => n.id === action.payload.id);
const {products} = state
if (itemIndex) {
const foundItem = products[itemIndex]
foundItem.count++
products[itemIndex] = foundItem
} else {
products.push({...action.payload, count: 1})
}
return { ...state, products }


сложные конструкции только вредят
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
SummerWeb Ярославль
от 120 000 до 180 000 ₽
КРАФТТЕК Санкт-Петербург
от 60 000 до 80 000 ₽
Brightdata Тель-Авив
от 5 500 до 6 500 $
14 июн. 2024, в 17:20
10000 руб./за проект
14 июн. 2024, в 17:16
3000 руб./за проект
14 июн. 2024, в 17:00
111111 руб./за проект