Я новичок в редуксе, пытаюсь добавить элемент в корзину, но получаю 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;
я использую рассылку
Я просто обновляю код, пожалуйста, вы можете пройти его еще раз. благодарю вас
Спасибо за обновление. А как насчет компонента, где вы читаете из магазина и отображаете его? Это должно выглядеть примерно так: const items = useSelector((state) => state.basket.items)
. См. этот пример.
я экспортировал его, поместив в переменную с именем selectItems, вот как это выглядит в компоненте BasketSlice: export const selectItems = (state) => state.basket.items
Попробуйте отображать элементы с хуком useSelector
, например, const items = useSelector(selectItems)
, а затем console.info(items)
всякий раз, когда вы добавляете/удаляете, чтобы увидеть, работает ли это.
Давайте продолжить обсуждение в чате.
спасибо за попытку помочь мне, но все еще показывает ту же ошибку
Либо верните НОВОЕ состояние из редуктора действий:
addToBasket: (state, action) => {
return { ...state, items: [...state.items, action.payload] }
},
или ИЗМЕНИТЬ существующее состояние, не заменяя его. И ничего не возвращать:
addToBasket: (state, action) => {
state.items.push(action.payload)
},
также в вашем примере укажите информацию о типе действия:
action: PayloadAction<type_of_item>
я не использую машинопись
Похоже, что состояние внутри компонента <Provider />
задано неправильно. Ваш store
является именованным экспортом, но он импортируется в _app.js
, как если бы это был экспорт default
(без фигурных скобок). Попробуйте вместо этого использовать import { store } from "../some_path_to_store"
.
Вот рабочий пример, чтобы завершить наше обсуждение из раздела комментариев: https://codesandbox.io/s/crazy-fire-o3tr54
большое спасибо, это была проблема
Как выглядит код вашего компонента с кнопками добавления/удаления? Используете ли вы хуки
useSelector
иuseDispatch
для чтения из магазина и действий отправки?