动作必须是普通对象。反应减少错误

Posted

技术标签:

【中文标题】动作必须是普通对象。反应减少错误【英文标题】:Actions must be plain objects. React-redux error 【发布时间】:2022-01-04 22:30:40 【问题描述】:

因此,我不知道为什么会遇到此错误,我已经查看了所有表格并尝试构建我的操作以表示正确的结构,但我仍然遇到此错误。有人可以帮我调试一下吗?

这里是动作:

export const listProjects =
  (pageNumber = "") =>
  async (dispatch) => 
    try 
      // Dispatch request type
      dispatch(PROJECT_LIST_REQUEST);
      // axios call
      const  data  = await axios(
        method: "GET",
        url: `/api/projects?page=$pageNumber`,
      );
      // on success dispatch request success
      dispatch(
        type: PROJECT_LIST_SUCCESS,
        payload: data,
      );
     catch (error) 
      dispatch(
        type: PROJECT_LIST_FAIL,
        payload:
          error.response && error.response.data.message
            ? error.response.data.message
            : error.message,
      );
    
  ;

这里是store

import  createStore, combineReducers, applyMiddleware  from "redux";
import thunk from "redux-thunk";
import  composeWithDevTools  from "redux-devtools-extension";

// import reducers
import  userLoginReducer  from "./reducers/userReducer";
import  projectListReducer  from "./reducers/projectsReducer";

const middleware = [thunk];

const reducer = combineReducers(
  userLogin: userLoginReducer,
  getProjects: projectListReducer,
);

const userInfoFromStorage = localStorage.getItem("userInfo")
  ? JSON.parse(localStorage.getItem("userInfo"))
  : null;

const initialState = 
  userLogin:  userInfo: userInfoFromStorage ,
;
const store = createStore(
  reducer,
  initialState,
  composeWithDevTools(applyMiddleware(...middleware))
);

export default store;

这里是调用动作以从 API 返回数据的 useEffect

useEffect(() => 
    dispatch(listProjects(page));
  , [dispatch, page]);

我有一个较早的项目,其中代码的结构相似,但是,我只是不明白我做错了什么。

【问题讨论】:

【参考方案1】:

看起来在您的 listProjects 函数中,您正在调度一个变量而不是一个动作 (dispatch(PROJECT_LIST_REQUEST);),而在其他函数中,您正在调度一个动作对象,但类型是变量/常量。

您是否将PROJECT_LIST_REQUEST / PROJECT_LIST_SUCCESS / PROJECT_LIST_FAIL 保存为该文件中的变量/常量?

通常您会使用字符串进行调度,因此将其更改为 dispatch(type: 'PROJECT_LIST_REQUEST') 应该可以解决错误,尽管您可能还需要将其他字符串转换为字符串:

dispatch(type: 'PROJECT_LIST_REQUEST')
...
dispatch(
    type: 'PROJECT_LIST_SUCCESS',
    payload: data,
); 
...
dispatch(
    type: 'PROJECT_LIST_FAIL',
    payload:
        error.response && error.response.data.message
        ? error.response.data.message
        : error.message,
);

【讨论】:

是的!实际上我正要评论说我想通了哈哈。我一直在查看我的代码和论坛,试图找出哪里出错了,但我认为这与函数的异步部分有关,而不是调度本身。感谢您的回答,我会将您的答案标记为正确答案!

以上是关于动作必须是普通对象。反应减少错误的主要内容,如果未能解决你的问题,请参考以下文章

Redux thunk - 错误 · 动作必须是普通对象。使用自定义中间件进行异步操作,即使调度具有键类型的对象

动作必须是普通对象。使用自定义中间件进行异步操作/未定义不是对象/使用 navigator.geolocation 出现错误

修复错误:动作必须是普通对象。相反,实际类型是:“未定义”。您可能需要将中间件添加到您的商店设置中

动作必须是普通对象。将自定义中间件用于异步功能。反应原生

redux-thunk:错误:动作必须是普通对象。使用自定义中间件进行异步操作

Redux 错误操作必须是普通对象。使用自定义中间件进行异步操作