ACTION не присоединялся к редуктору, несмотря на состояние редуктора в реакции-редукции

Я поставил логику действия для получения API DATA от AXIOS, затем в качестве метода отправки я попытался привести полученные данные в состояние. Но в этот момент действия до редюсера не дошли.

(6) [{…}, {…}, {…}, {…}, {…}, {…}]
index.js:23 Uncaught (in promise) TypeError: dispatch is not a function
at index.js:23

Просто я получил эту ошибку выше. Это означает, что это действие действительно получило данные API, а затем при попытке отправить его не удалось. Я мог бы найти точку соединения этого.

Я прикрепляю JavaScript:

редуктор.js:

import * as types from '../Actions/Types';

const initialState = {
  contents: [{
    poster: 'https://i.imgur.com/633c18I.jpg',
    title: 'state title',
    overview: 'state overview',
    id: 123,
  }],
  content: {},
};

const reducer = (state = initialState, action) => {
  switch (action.type) {
    case types.LOADING_DATA: {
      console.log(`something happend ${action.payload}`);
      return state.set('contents', action.payload);
    }

    case types.BTN_ON_CHANGE: {
      return state;
    }

    case types.BTN_ON_CLICK: {
      return state;
    }

    case types.BTN_ON_SUBMIT: {
      return state;
    }

    default:
      return state;
  }
};

export default reducer;

действия.js

 import axios from 'axios';

import * as types from './Types';


const holder = [];
const API_GET = () => (
  axios.get('https://api.themoviedb.org/3/search/movie?api_key=<<APIKEY>>&query=avengers+marvel')
    .then(res => res.data)
    .then(data => console.log(data.results))
    .then(results => holder.add(results))
);

// export const loadingData = value => ({
//   type: types.LOADING_DATA,
//   value,
// });

export const loadingData = () => (dispatch) => {
  axios.get('https://api.themoviedb.org/3/search/movie?api_key=54087469444eb8377d671f67b1b8595d&query=avengers+marvel')
    .then(res => res.data)
    .then(data => console.log(data.results))
    .then(results => dispatch({
      type: types.LOADING_DATA,
      payload: results,
    }));
};

export const sample = () => (
  console.log('none')
);

ЗагрузкаDataButton.js:

    import React from 'react';
import PropTypes from 'prop-types';
import { connect } from 'react-redux';
import { Button } from 'antd';
import { loadingData } from '../Actions';

const LoadingDataButton = props => (
  <div>
    <Button
      type="danger"
      onClick={
      props.loadingData()
    }
    >
            Loading
    </Button>
  </div>
);

LoadingDataButton.propTypes = {
  loadingData: PropTypes.func.isRequired,
};

const mapStateToProps = state => ({
  contents: state.contentR.contents,
});
const mapDispatchToState = {
  loadingData,
};

export default connect(mapStateToProps, mapDispatchToState)(LoadingDataButton);

person Logan Lee    schedule 07.08.2018    source источник
comment
Вы говорите, что ваше действие не перехватывается вашим редуктором?   -  person Madhu Bhat    schedule 07.08.2018
comment
Не связано с упомянутой вами ошибкой, но в вашем действии loadingData у вас есть шаг регистрации (.then(data => console.log(data.results))). console.log возвращает undefined, поэтому, помещая это в середину вашей цепочки обещаний, следующий обработчик помещает undefined в полезную нагрузку действия. Удаление этой строки исправляет это?   -  person zkcro    schedule 07.08.2018
comment
Вам нужно использовать правильный middleWare для этого   -  person Abin Thaha    schedule 07.08.2018
comment
@ZaidCrouch, я тоже удалил его, но у меня такая же ошибка,   -  person Logan Lee    schedule 07.08.2018
comment
Как я уже сказал, не думал, что это связано с ошибкой, которую вы упомянули, но рано или поздно это сбило бы вас с толку. Однако вопрос Абинтахи правильный: вы определенно добавили нужное промежуточное ПО (похоже на redux-thunk в свой магазин)?   -  person zkcro    schedule 07.08.2018
comment
comment
@ZaidCrouch хорошо, я еще не использую промежуточное программное обеспечение, как только оно заработает, я превращу его в сагу о редуксе.   -  person Logan Lee    schedule 07.08.2018
comment
Без промежуточного программного обеспечения вы можете отправлять только простые объекты в качестве действий. Ваше действие loadingData возвращает функцию, вам нужно какое-то промежуточное программное обеспечение, чтобы что-то с этим делать.   -  person zkcro    schedule 07.08.2018
comment
@ZaidCrouch Спасибо :) Ваш совет мне очень помог! ;)   -  person Logan Lee    schedule 07.08.2018


Ответы (2)


Вам нужно, чтобы ваши создатели действий возвращали функции, которые выполняют асинхронные запросы, прямо сейчас ваши создатели действий возвращают только объекты, мы можем возвращать функции, используя промежуточное программное обеспечение redux-thunk

Затем вы должны написать своих создателей действий, которые делают вызовы API, подобные этому.

export const fetchThreadData = id => dispatch => {
  dispatch({
    type: FETCH_THREADS_REQUESTING,
    isLoading: true
  });

  const request = axios({
    method: "GET",
    url: "SOME API ADDRESS"
  });

  return request.then(
    response =>
      dispatch({
        type: FETCH_THREADS_SUCCESSFUL,
        payload: response.data,
        isLoading: false
      }),
    error =>
      dispatch({
        type: FETCH_THREADS_FAILED,
        payload: error || "Failed to fetch thread",
        isLoading: false
      })
  );
};
person Paul McLoughlin    schedule 07.08.2018

Спасибо, ребята, что ответили на мой вопрос, на самом деле я решил эту проблему довольно простым способом.

import { createStore, applyMiddleware, compose } from 'redux';
// import saga from 'redux-saga';
import thunk from 'redux-thunk';

import rootReducer from './rootReducer';

const initialState = {};

const middleWare = [thunk];

const store = createStore(
  rootReducer,
  initialState,
  compose(
    applyMiddleware(...middleWare),
    window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__(),
  ),
);

export default store;

Я планировал использовать SAGA после того, как сделал это, но как только я изменил промежуточное программное обеспечение как преобразователь, все сработало хорошо. Может быть, мне нужно выяснить, как работает преобразователь.

Даже если я предпочитаю использовать SAGA на этот раз, я хочу сказать спасибо за Thunk.

person Logan Lee    schedule 07.08.2018