Redux工具包combineReducers问题:Store没有有效的reducer。确保传递给combineReducers的参数是一个对象,其

meA*_*rew 2 reactjs redux redux-toolkit

请告诉我我做错了什么?配置Store.js:

import {configureStore, combineReducers} from "@reduxjs/toolkit";
import pokemonSearchSlice from "./slices/pokemonSearch";

const reducer = combineReducers({
pokemonSearch: pokemonSearchSlice
});

const store = configureStore({
reducer
});



export default store;
Run Code Online (Sandbox Code Playgroud)

pokemonSearch.js

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



const pokemonSearchSlice = createSlice({
    name: "pokemonSearch",
    initialState: {
        searchInputValue: ""
    },
    reducers: {
setValue:(state, action)=>({...state, searchInputalue: action.payload})
    }
}) ;



export const {setValue} = pokemonSearchSlice.actions;

export default pokemonSearchSlice;
Run Code Online (Sandbox Code Playgroud)

错误全文:redux.js:394 Store 没有有效的减速器。确保传递给combineReducers 的参数是一个值为reducer 的对象。另外,我无法从商店获取“searchInputValue”,控制台显示:无法解构“(0,react_redux__WEBPACK_IMPORTED_MODULE_2__.useSelector)(...)”的属性“searchInputValue”,因为它未定义。但我认为这是因为combineReducers 错误。有什么建议么?

Jim*_*dra 7

这里有几个问题:

  • configureStore自动呼叫combineReducers您,因此您不想直接这样做。
  • configureStorereducer对象需要减速器,但您要传递给它一个切片。(切片包含一个减速器,但切片本身不是减速器。)
  • setValue正在返回一个新对象,但 RTK 使用 Immer,因此您应该改变传递到函数中的状态并且不返回任何内容。

最后你的代码应该是这样的:

// configureStore.js
import { configureStore } from "@reduxjs/toolkit";
import pokemonSearchSlice from "./slices/pokemonSearch";

const store = configureStore({
  reducer: {
    pokemon: pokemonSearchSlice,
  },
});

export default store;
Run Code Online (Sandbox Code Playgroud)
// slices/pokemonSearch.js"
import { createSlice } from "@reduxjs/toolkit";

const pokemonSearchSlice = createSlice({
  name: "pokemonSearch",
  initialState: {
    searchInputValue: "",
  },
  reducers: {
    setValue: (state, action) => {
      state.searchInputValue = action.payload;
    },
  },
});

export const { setValue } = pokemonSearchSlice.actions;

export default pokemonSearchSlice.reducer;
Run Code Online (Sandbox Code Playgroud)