Трудности с созданием действия, которое извлекает данные с помощью React Redux и axios

#reactjs #redux #react-redux #axios #redux-thunk

#reactjs #redux #react-redux #axios #redux-thunk

Вопрос:

Я потратил эти выходные на изучение Redux, но я не могу понять, как я могу выполнять вызовы API, используя axios, Redux и Redux Thunk

Я удалил все из этого примера проекта, так что осталось только одно действие: то, из которого я хочу получить свои данные.

Вот ссылка на мой codesandbox

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

Мой редуктор

 const initialState = {
  data: [],
};

const reducer = (state = initialState, action) => {
  const newState = { ...state };

  switch (action.type) {
    case 'SOMETHING':
      newState.data = action.data;
      console.log(newState.data);
      break;
    default:
      newState;
  }
  return newState;
};

export default reducer;
  

Мое действие

 import axios from 'axios';

export function someFunction() {
  return (dispatch) => {
    axios.get('https://api.pokemontcg.io/v1/types').then((response) => {
      dispatch({ type: 'SOMETHING', data: response.data });
    });
  };
}
  

Мой App.js

 function App({ someFunction }) {
  return (
    <div className="App">
      <button onClick={someFunction}>Click Me</button>
    </div>
  );
}

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

const mapDispatchToProps = (dispatch) => {
  return {
    something: () => dispatch(actionCreator.someFunction()),
  };
};
export default connect(mapStateToProps, mapDispatchToProps)(App);
  

Комментарии:

1. Вам нужно ссылаться на prop name как на то, что вы вернули в mapDispatchToProps , а не на фактическое имя функции-создателя действия.

Ответ №1:

Вы были почти на месте! Проблемы здесь:

 const mapDispatchToProps = (dispatch) => {
  return {
    something: () => dispatch(actionCreator.someFunction()),
  };
};
  

Вы предлагаете redux сопоставить dispatch действия с вызываемыми реквизитами { something } . Вам нужно либо переименовать prop в something , либо переименовать map в someFunction .

 const mapDispatchToProps = (dispatch) => {
  return {
    someFunction: () => dispatch(actionCreator.someFunction()),
  };
};
  

Комментарии:

1. @ItzaMi, небольшое дополнение к вышесказанному с object short hand обозначением, const mapDispatchToProps = { someFunction: actionCreator.someFunction }; . Вы можете объявить простые действия, подобные этому. Проверьте здесь для получения более подробной информации

2. Спасибо, @Cehhiro, не могу поверить, что я этого не видел. Сегодня я впервые погрузился в Redux, и количество концепций было слишком большим, но я ценю ваш быстрый ответ!

3. У меня новый вопрос, @Cehhiro. Как я мог бы заполнить свое состояние начальным вызовом axios прямо при загрузке страницы?