动作必须是普通对象。 Redux 不工作

Posted

技术标签:

【中文标题】动作必须是普通对象。 Redux 不工作【英文标题】:Actions must be plain objects. Redux not working 【发布时间】:2019-04-26 21:39:33 【问题描述】:

我正在尝试添加 redux-thunk 中间件以将注册和登录功能放入我的应用程序中。但是代码似乎不适用于注册。它给出了以下错误 -

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

代码如下

Index.js - 导入 thunk 并使用它

 import createStore, applyMiddleware from 'redux';
 import thunk from 'redux-thunk';
 const store = createStore(authReducer,applyMiddleware(
                            thunk, 
                            loggerMiddleware
                            ),window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__());

ReactDOM.render(
    <Provider store=store>
        <App />
    </Provider>, 
    document.getElementById('root'));

actions/authActions.js - 创建注册函数来调度动作

export function register()
    return (dispatch)=>

        dispatch(type:'auth_user')

    

components/Register.js - 使用上述redux注册功能的组件

import  * as actions  from '../actions/authActions';

class RegisterForm extends React.Component

handleRegister = (e)=>
    e.preventDefault();
    console.log("inside handle register");
    console.log(this.props);
    this.props.register();
 

var Register = connect(mapStateToProps,actions)(RegisterForm);

authReducer.js

import AUTH_ERROR,UNAUTH_USER,FETCH_MESSAGE, AUTH_USER from '../actions/types';


const initialState = 
    loggedIn:false,
    errorMessage:''


const   authReducer = (state=initialState,action)=>
    console.log("action is")
    console.log(action);
    switch(action.type)
        case AUTH_USER:
            
                console.log("Reached in reducer");
                return ...state,loggedIn:true

        case UNAUTH_USER:
            return ...state, loggedIn:false
        default:
            return state;
    



export default authReducer;

/action/types.js

export const AUTH_USER = 'auth_user'
export const UNAUTH_USER = 'unauth_user'
export const AUTH_ERROR = 'auth_error'
export const FETCH_MESSAGE = 'fetch_message'

【问题讨论】:

您的商店设置错误。 你能告诉我出了什么问题吗?以及如何纠正它。 【参考方案1】:

您的商店设置似乎不正确。将您的商店写为:

import  createStore, applyMiddleware, compose  from 'redux';
import thunk from 'redux-thunk';

const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;
const store = createStore(
  authReducer,
  ,
  composeEnhancers(
    applyMiddleware(
      thunk,
      loggerMiddleware
    )
  )
);

【讨论】:

您好 Arup,这正在消除错误,但该操作不会进入 Reducer。你能帮忙吗? @AbhishekKulshrestha 该操作是否在执行任何异步调用?如果没有,则无需执行return (dispatch)=&gt; . 将来它会进行异步调用,但现在我只是检查这段代码。如果可行,我会将异步代码放入其中。 当它是异步调用时,那么只这样写,直到那时像非异步动作创建者一样写动作..【参考方案2】:

你可以在actions中尝试以下sn-p吗?

export function register=()=>
    return 
        type:'auth_user'
    

【讨论】:

以上是关于动作必须是普通对象。 Redux 不工作的主要内容,如果未能解决你的问题,请参考以下文章

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

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

动作必须是普通对象。使用自定义中间件

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

如何修复'动作必须是普通对象。使用自定义中间件进行异步操作。

动作必须是普通对象。将自定义中间件用于测试库而不是应用程序上的异步操作