Почему я не получаю состояние в своем приложении

Я новичок в редуксе, пытаюсь добавить элемент в корзину, но получаю TypeError: Невозможно прочитать свойства неопределенного (чтение «getState»). почему я не могу получить состояние, есть ли что-то, что мне нужно сделать, что я не делаю, пожалуйста, что я делаю неправильно. я использую хук useDispatch для чтения хранилища и отправки действия

привет мой код

import { createSlice } from '@reduxjs/toolkit';

const initialState = {
    items: [],
}

export const basketSlice = createSlice({
    name: "basket",
    initialState,
    reducers: {
        addToBasket: (state, action) => {
            state.items = [...state.items, action.payload]
        },
        removeFromBasket: (state, action) => {},
    }
});

export const { addToBasket, removeFromBasket} = basketSlice.actions;
export const selectItems = (state) => state.basket.items;
export default basketSlice.reducer;



import { configureStore } from "@reduxjs/toolkit";
import basketReducer from "../slices/basketSlice";

export const store = configureStore({
    reducer: {
        basket: basketReducer,
    },
});

import '../styles/globals.css'
import { SessionProvider } from "next-auth/react"
import { Provider } from 'react-redux'
import store from '../app/store'

export default function App({
  Component,
  pageProps: { session, ...pageProps },
}) {
  return (
    <Provider store = {store}>
      <SessionProvider session = {session}>
        <Component {...pageProps} />
      </SessionProvider>
    </Provider>  
  )
}

import { useDispatch } from 'react-redux'
import {addToBasket} from "../slices/basketSlice"

const Product = ({id, title, description, price, image, category }) => {

  const dispatch = useDispatch();

      const addItemToBasket = () => {
          const product = {
            id,
            title, 
            description, 
            price, 
            image, 
            category 
          }

          dispatch(addToBasket(product))
      }

  return (
    <div className = "relative flex flex-col m-10 p-10 bg-white rounded-3xl">
        <button onClick = {addItemToBasket} className = " button">Add to basket</button>
    </div>
  )
}

export default Product;

Как выглядит код вашего компонента с кнопками добавления/удаления? Используете ли вы хуки useSelector и useDispatch для чтения из магазина и действий отправки?

Mark G 22.03.2022 14:17

я использую рассылку

jonuel 22.03.2022 14:24

Я просто обновляю код, пожалуйста, вы можете пройти его еще раз. благодарю вас

jonuel 22.03.2022 14:31

Спасибо за обновление. А как насчет компонента, где вы читаете из магазина и отображаете его? Это должно выглядеть примерно так: const items = useSelector((state) => state.basket.items). См. этот пример.

Mark G 22.03.2022 14:37

я экспортировал его, поместив в переменную с именем selectItems, вот как это выглядит в компоненте BasketSlice: export const selectItems = (state) => state.basket.items

jonuel 22.03.2022 14:43

Попробуйте отображать элементы с хуком useSelector, например, const items = useSelector(selectItems), а затем console.info(items) всякий раз, когда вы добавляете/удаляете, чтобы увидеть, работает ли это.

Mark G 22.03.2022 14:48

Давайте продолжить обсуждение в чате.

jonuel 22.03.2022 14:56

спасибо за попытку помочь мне, но все еще показывает ту же ошибку

jonuel 22.03.2022 15:19
10 вопросов на собеседовании по React js
10 вопросов на собеседовании по React js
Вопрос: Что такое React JS? Каковы преимущества использования React?
0
8
41
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Либо верните НОВОЕ состояние из редуктора действий:

        addToBasket: (state, action) => {
            return { ...state, items: [...state.items, action.payload] }
        },

или ИЗМЕНИТЬ существующее состояние, не заменяя его. И ничего не возвращать:

        addToBasket: (state, action) => {
          state.items.push(action.payload)
        },

также в вашем примере укажите информацию о типе действия:

action: PayloadAction<type_of_item>

я не использую машинопись

jonuel 22.03.2022 14:33
Ответ принят как подходящий

Похоже, что состояние внутри компонента <Provider /> задано неправильно. Ваш store является именованным экспортом, но он импортируется в _app.js, как если бы это был экспорт default (без фигурных скобок). Попробуйте вместо этого использовать import { store } from "../some_path_to_store".

Вот рабочий пример, чтобы завершить наше обсуждение из раздела комментариев: https://codesandbox.io/s/crazy-fire-o3tr54

большое спасибо, это была проблема

jonuel 24.03.2022 07:07

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