Увеличение счетчика в редукторе createSlice Redux-Toolkit

Я пытаюсь увеличить счетчик внутри функции редуктора для объекта. Здесь, в действии addItem, я пытаюсь увеличить количество, если добавленный товар уже присутствует в магазине.

import { createSlice, current } from "@reduxjs/toolkit";
import React from "react";

const cartSlice = createSlice({
  name: "cart",
  initialState: {
    items: [],
  },
  reducers: {
    addItem: (state, action) => {
      let a = 0;
      current(state.items).map((item) => {
        console.info(item, "hey there");
        if (item === action.payload) {
          console.info("Matched");
          console.info("Count1 is", ++item.card.info.count);
          item.card.info.count = item.card.info.count + 1;
          console.info("Count2 is", item.card.info.count);
          a = 1;
          return;
        }
      });
      if (a == 0) {
        state.items.push(action.payload);
      }
    },
    removeItem: (state, action) => {
      state.items.pop();
    },
    clearCart: (state, action) => {
      state.items.length = 0;
    },
  },
});

export const { addItem, removeItem, clearCart } = cartSlice.actions;

export default cartSlice.reducer;

Ниже прикрепляю вывод консоли.

{card: {…}} 'hey there'
cartSlice.js:15 Matched
cartSlice.js:16 Count1 is 1
cartSlice.js:18 Count2 is 0
cartSlice.js:13 {card: {…}} 'hey there'
cartSlice.js:15 Matched
cartSlice.js:16 Count1 is 1
cartSlice.js:18 Count2 is 0
cartSlice.js:13 {card: {…}} 'hey there'
cartSlice.js:15 Matched
cartSlice.js:16 Count1 is 1
cartSlice.js:18 Count2 is 0
cartSlice.js:13 {card: {…}} 'hey there'
cartSlice.js:15 Matched
cartSlice.js:16 Count1 is 1
cartSlice.js:18 Count2 is 0
cartSlice.js:13 {card: {…}} 'hey there'
cartSlice.js:15 Matched
cartSlice.js:16 Count1 is 1
cartSlice.js:18 Count2 is 0

Посоветуйте мне, что я делаю здесь неправильно.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
62
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Утилита current дает вам только текущее значение состояния, но это не черновое состояние, которое вам следует обновлять.

Функция current из библиотеки immer, которая делает снимок текущее состояние черновика и завершает его (но без заморозки). Current — отличная утилита для печати текущего состояния во время отладка, а вывод current также можно безопасно выпустить наружу продюсер.

По сути, это копия состояния, а не фактическое состояние, поэтому любые обновления/мутации/и т. д. копии не будут иметь абсолютно никакого влияния на фактическое состояние Redux.

Обычной практикой является сначала поиск в массиве соответствующего элемента, который вы хотите обновить, и если он найден, обновите его (с возможностью изменения), в противном случае добавьте его в массив.

Пример:

addItem: (state, action) => {
  const item = state.items.find(
    item => item.someProperty === action.payload.someProperty
  );

  if (item) {
    item.card.info.count++;
  } else {
    state.items.push(action.payload);
  }
},

Спасибо, у меня то же самое получилось с помощью удара и пробы. Я хотел бы добавить здесь то, что я сравнивал два объекта (item===action.payload), что было неправильно и потребовало много времени, чтобы понять это. Итак, для моего случая (item.somaValue === action.payload.someValue) такое сравнение применимо. Еще раз спасибо, что прояснили ситуацию для всех.

Shakti Raj Singh 06.05.2024 08:14

@ShaktiRajSingh Да, мне действительно было интересно, передаете ли вы объекты состояния обратно через полезные данные действий, но, поскольку казалось, что ваши журналы работают, значит, все в порядке. Согласен, обычно вы сравниваете свойства объекта, например. как id недвижимость и т. д.

Drew Reese 06.05.2024 08:16

Другие вопросы по теме

Ошибка: не удалось найти значение контекста реакции-редукса; убедитесь, что компонент завернут в <Provider> в собственном приложении React Expo
Состояние React Redux не отображается с помощью библиотеки React-Router
Как использовать одну и ту же функцию запроса RTK несколько раз с разными параметрами в одном и том же компоненте?
Как получить доступ к «селекторам» из фрагмента в наборе инструментов Redux
Обновите токен доступа с помощью набора инструментов redux-toolkit asyncThunks
В React/Next.js после нажатия ссылки данные не будут обновляться
Как убрать эту ошибку? redux-persist не удалось создать хранилище синхронизации. возвращение к хранилищу Noop
Как избежать вспышки ненужного компонента в течение 1 секунды после получения данных в React?
Рендеринг запускается в середине обновления Redux
Компонент «Таблица реакции-табулятора» выдает ошибку при передаче данных по состоянию редукции