Вызов действия с Redux-thunk не работает - PullRequest
0 голосов
/ 31 марта 2020

Я пытаюсь использовать избыточность с реакцией для выполнения вызова API для получения некоторых данных. При вызове функции в моем компоненте редуктор не видит action.type, а функция возвращает разрешение Promise. Я не использовал Redux-Thunk раньше. Я считаю, что код, который у меня есть, должен работать, но мне трудно найти ошибку. Вот код

Индекс. js

const store = createStore(rootReducer, composeWithDevTools(applyMiddleware(thunkMiddleware, devToolsEnhancer)));

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

Действие

import axios from 'axios';

export const GET_ALL_CASES = "GET_ALL_CASES";


const getCasesSuccess = (cases) => {
    return {
        type: GET_ALL_CASES,
        cases
    }
};

export const getAllCases = () => {
    return (dispatch) => {
        axios.get('https://corona.lmao.ninja/countries?sort=country')
        .then(response => {
            dispatch(getCasesSuccess(response.cases))
        })
        .catch(error => {
            throw(error)
        })
    }
}

Редуктор

import { GET_ALL_CASES } from '../actions';

const initialState = {
    allCases: []
}

const rootReducer = (state = initialState, action) => {
    switch (action.type) {
        case GET_ALL_CASES:
            return { ...state, allCases: [...action.cases]}
        default:
            return state;
    }
}

export default rootReducer;

Компонент

class Second extends React.Component {
    constructor(props) {
        super(props);
        this.state = {  }
    }

    componentDidMount = () => {
        getAllCases()
    }


    render() { 
        return ( 
            <div>
                {this.props.data[0]}
            </div>
         );
    }
}

const mapStateToProps = (state) => (
    {
      data: state.allCases
    }
  )

  const mapDispatchToProps = dispatch => {
    return {
      getAllCases: () => dispatch(getAllCases())
    }
  }

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

При вызове функции, если я изменяю ее на this.props.getAllCases (), я получаю эту ошибку.

Unhandled Rejection (Error): Expected the reducer to be a function.
▶ 5 stack frames were collapsed.
getAllCases
C:/Users/Owner/Desktop/corona-app/src/containers/second.js:33
  30 | 
  31 | const mapDispatchToProps = dispatch => {
  32 |   return {
> 33 |     getAllCases: () => dispatch(getAllCases())
     | ^  34 |   }
  35 | }
  36 | 

1 Ответ

1 голос
/ 31 марта 2020

Существуют разные способы использования dipatchMapToProps или как его называют.

Но не думайте об этом слишком много, как я, используйте самый простой

  • как объект
const dispatchToProps = {
  fun1,
  enter,
  code,
  herefun2
}
  • как функция
const mapDispatchToProps = dispatch => {
  return {
    // dispatching plain actions
    increment: () => dispatch({ type: 'INCREMENT' }),
    decrement: () => dispatch({ type: 'DECREMENT' }),
    reset: () => dispatch({ type: 'RESET' })
  }
    import React from "react";
    import {connect} from "react-redux";
    import {getAllCases} from "path-of-the-file";

    class Second extends React.Component {
        constructor(props) {
            super(props);
            this.state = {
                someState: ""
            }
        }

        componentDidMount () {
           const { getAllCases } this.props;

           getAllCases()
        }


        render() { 

          const {data} = this.props;

            return ( 
                <div>
                    {data[0]}
                </div>
             );
        }
    }

    const mapStateToProps = (state) => {
       return {
          data: state.allCases
        }
      }

      const mapDispatchToProps = { getAllCases }

    export default connect(mapStateToProps, mapDispatchToProps)(Second);
    ```
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...