代码之家  ›  专栏  ›  技术社区  ›  Learner

错误:操作必须是纯对象。对异步操作使用自定义中间件。-即使操作也包含该方法

  •  0
  • Learner  · 技术社区  · 6 年前

    我是新来的反应,只是理解了关于redux的概念,而不使用redux thunk。请看下面的代码

    // app.js
    
    import React, { Component } from 'react';
    import {connect} from 'react-redux';
    import * as actions from './actions'
    
    class App extends Component {
      render() {
        return (
          <div>
            <button onClick={this.props.fetchData}>Show Data</button>
          </div>
        );
      }
    }
    
    const mapStateToProps = state => {
      return {
    
      }
    }
    
    
    const mapDispatchToProps = dispatch => {
      return {
        fetchData: () => dispatch(actions.fetchDataHandler)
      }
    }
    
    
    
    export default connect(mapStateToProps, mapDispatchToProps)(App);
    
    
    // index.js
    
    import React from 'react';
    import ReactDOM from 'react-dom';
    import './index.css';
    import App from './App';
    import registerServiceWorker from './registerServiceWorker';
    import {createStore} from 'redux';
    import Data from './reducers';
    import {Provider} from 'react-redux';
    
    const store = createStore(Data)
    
    ReactDOM.render(<Provider store={store}><App /></Provider>, document.getElementById('root'));
    registerServiceWorker();
    
    
    //actions-index.js
    
    export const fetchDataHandler = e => dispatch => {
        console.log("hit here");
    }
    
    //reducers-index.js
    
    // default state
    const defaultState = {
        data: null
    }
    
    let data;
    
    export default data = (state=defaultState, action) => {
        switch(action.type){
            case "FETCH_DATA": 
                return {
                    ...state,
                    data: action.payload
                }
            default:
                return{
                    ...state
                }
        }
    }

    文件夹结构为

    src 
      actions
        index.js
      reducers
        index.js
      app.js
    

    我没有使用redux thunk,当单击按钮时,它将调用将调用actions.fetchdatahandler的fetchdata。

    因此,在控制台上,它应该会收到一条“点击这里”的消息,但它不起作用。

    抱歉,如果我不正确理解Redux的概念。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Shubham Khatri    6 年前

    在正常的redux流中,操作应该是纯对象,即动作创建者必须返回纯对象,但在您的情况下,由于您不需要使用任何中间件(如redux thunk),因此不能编写类似

    //actions-index.js
    
    export const fetchDataHandler = e => dispatch => {
        console.log("hit here");
    }
    

    一般的方法是

    export const fetchDataHandler = e => {
        console.log("hit here");
        return {
            type: 'MY_ACTION'
        }
    }
    

    但是,如果您配置类似 redux-thunk ,您可以在动作创建者中有一个异步动作,比如

    //actions-index.js
    
    export const fetchDataHandler = e => dispatch => {
        console.log("hit here");
        API.call().then((res) => {
            dispatch({ type: 'API_SUCCESS', payload: res });
        });
    }
    

    另外,您的mapDispatchTopOps不会在Dispatch中调用该操作,您可以这样编写它

    const mapDispatchToProps = dispatch => {
      return {
        fetchData: () => dispatch(actions.fetchDataHandler())
      }
    }
    

    const mapDispatchToProps = {
        fetchData: actions.fetchDataHandler
    }