【问题标题】:Why am i getting "Error: Actions must be plain objects. Use custom middleware for async actions." error?为什么我会收到“错误:操作必须是普通对象。使用自定义中间件进行异步操作。”错误?
【发布时间】:2018-04-28 14:03:35
【问题描述】:

我不断收到“操作必须是普通对象。使用自定义中间件进行异步操作。”错误,我完全被困在这里。我在这里做错了什么请帮我弄清楚并帮助我摆脱这个错误。

这是我的 index.js 文件,我已将 redux 商店集成到应用程序中。

import "babel-polyfill";
import React from 'react';
import ReactDOM from 'react-dom';
import { BrowserRouter as Router } from 'react-router-dom';
import { Provider } from 'react-redux'
import { composeWithDevTools } from 'redux-devtools-extension';
import { createStore, applyMiddleware, combineReducers, compose} from 'redux'
import createSagaMiddleware from 'redux-saga'
import rootSaga from './sagas'
import { postsReducer } from './reducers/posts'
import Routes from './routes';

import './styles/style.css'
const rootReducer = combineReducers({ postsReducer })
const sagaMiddleware = createSagaMiddleware()
const store = createStore(rootReducer, composeWithDevTools(applyMiddleware(sagaMiddleware)))
sagaMiddleware.run(rootSaga)

ReactDOM.render((
    <Provider store={store}>
        <Router><Routes /></Router>
    </Provider>
), document.getElementById('root'))

这是我的 saga.js

import { take, put, call, fork, select, takeEvery, all, takeLatest } from 'redux-saga/effects'
import PostApi from './api/postApi';
import { gotPosts } from './actions/celebrity';
import { POSTS } from '../types'

export function* getAllPosts () {
    const posts = yield call(PostApi.getPosts, {})
    console.log('postssss', posts)
    yield put(gotPosts(posts.data))
}

export function* watchGetPosts () {
    yield takeLatest(POSTS, getAllPosts)
}


export default function* root() {
    yield all([  fork(watchGetPosts) ])
}

这是我的 action.js

import { POSTS } from '../../types';


export const gotPosts = (data) => {
    return {
        type: POSTS,
        data,
    }
}

export const getPosts = () => dispatch => {
    dispatch(gotPosts);
}

这是我发送操作的组件页面。

import React, { Component } from 'react';
import { Card, Row, Col } from 'antd';
import { Link } from 'react-router-dom';
import { connect } from 'react-redux'
import { getPosts } from '../actions/celebrity';

const { Meta } = Card;

class  MainPage extends Component {
    componentDidMount () {
        console.log(this.props)
        this.props.getPosts();
    }
    render() {
        return <Row type="flex" className="main" justify="center" align="between">
             ......
        </Row>
    }
}

const mapStateToProps = state => {
    return {
        posts: state.postsReducer
    }
}
const mapDispatchToProps = dispatch => ({
    getPosts: () => {
    dispatch(getPosts());
    },
   });

export default connect(mapStateToProps, mapDispatchToProps)(MainPage);

postsReducer

export const postsReducer = (state = [], action) => {
    console.log(action)
    switch(action.type){
        case POSTS:
            return action.data;
        default:
            return state;
    }
}

【问题讨论】:

    标签: redux react-redux redux-saga


    【解决方案1】:

    您无法在没有中间件支持的情况下调度 函数

    问题源于 mapDispatchToProps:

    {
      getPosts: () => { dispatch(getPosts()); }   
    }
    

    追溯到你的actions.js,getPosts()返回dispatch =&gt; dispatch(gotPosts),这实际上是一个函数而不是一个动作(计划javascript对象),redux调度默认不识别函数,除非你使用中间件来增强它,例如redux thunk

    由于您已经有用于异步流的 redux saga,只需从 mapDispatchToProps 调度一个操作就可以了,如果可能,还可以考虑创建单独的操作来区分 POSTS_REQUESTPOSTS_RECEIVEPOSTS_FAILURE

    import {POST} from '....../actionTypes'
    ...
    {
      getPosts: () => { dispatch({ type: POST }); }   
    }
    

    【讨论】:

    • 非常感谢我按照您所说的进行更改后没有出现我在控制台中遇到的错误,但是我在“给定操作“POSTS”中收到此错误,reducer“postsReducer”返回未定义。忽略一个动作,你必须显式返回之前的状态。如果你希望这个 reducer 不持有任何值,你可以在 redux saga 中返回 null 而不是 undefined”如果你能指导我在这里做错了什么,这将对你有很大帮助我。
    • 使用default params 为您的postReducer 添加一个defaultState,例如postReducer(state = INITIAL_STATE, action)
    • 上面我已经添加了我的postReducer
    • PostApi.getPosts() 调用成功了吗,您记录的 action.data === 'undefined' 吗?
    • 终于解决了我的一些错误。你的建议对我有帮助,谢谢
    猜你喜欢
    • 2019-12-18
    • 2018-02-24
    • 1970-01-01
    • 2018-01-30
    • 2020-11-05
    • 2019-12-26
    • 2020-11-09
    • 2021-03-21
    • 2021-11-04
    相关资源
    最近更新 更多