Задать вопрос
@qfrontend

Как сделать запрос на сервер в action и сохранить значение?

Приветствую) Изучаю react/redux, и совсем запуталась(((
Есть CatalogAction.js
//action
const getProducts = id => {
  console.log(id); // выводит id
  return dispatch => {
    dispatch({
      type: GET_PRODUCTS_REQUEST,
      payload: {
        wait: true
      }
    });
  };
};

Как в данном случае сделать запрос на сервер в action (getProducts) по адресу (id + ".json")? И ответ (т.е объект который придёт от сервера) записать в (type: GET_PRODUCTS_SUCCESS), что бы обновить store?
dispatch({
      type: GET_PRODUCTS_SUCCESS,
      payload: {
        wait: true
        product: data // ответ от сервера записать сюда
      }


редюсер catalogR.js
const initialState = {
  wait: false,
  products: {
    a: "апельсин",
    b: "яблоко",
    c: "банан"
  }
};

export function catalogR(state = initialState, action) {
  switch (action.type) {
    case GET_PRODUCTS_REQUEST:
      return {
        ...state,
        wait: action.payload.wait
      };
    case GET_PRODUCTS_SUCCESS:
      return {
        ...state,
        wait: action.payload.wait,
        products: action.payload.products
      };
    default:
      return state;
  }
}

store.js
import { createStore, applyMiddleware } from "redux";
import { rootReducer } from "../reducers/rootReducer";
import thunk from "redux-thunk";
import logger from "redux-logger";

export const store = createStore(rootReducer, applyMiddleware(thunk, logger));

CatalogNavContainer.js
import React, { Component } from "react";
import { connect } from "react-redux";
import CatalogNav from "../../components/content/CatalogPage/Catalog/CatalogNav/CatalogNav";
import getProducts from "../../actions/CatalogAction";

class CatalogNavContainer extends Component {
  render() {
    return (
      <div className="CatalogNavContainer">
        <CatalogNav getProducts={this.props.getProducts} />
      </div>
    );
  }
}

// приклеиваем данные из store
const mapStateToProps = store => {
  return {
    c: null
  };
};

const mapDispatchToProps = dispatch => {
  return {
    getProducts: year => dispatch(getProducts(year))
  };
};

// в наш компонент App, с помощью connect(mapStateToProps)
export default connect(
  mapStateToProps,
  mapDispatchToProps
)(CatalogNavContainer);
  • Вопрос задан
  • 1546 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
const getProducts = id => {
  console.log(id); // выводит id
  dispatch({
      type: GET_PRODUCTS_REQUEST,
      payload: {
      wait: true
    }
  });
  return dispatch => {
    fetch(`/backend/${id}.json`)
      .then(
        response => dispatch({
          type: GET_PRODUCTS_SUCCESS,
          payload: {
            wait: false,
            products: response.json()
          }
        })
      )
  };
};
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Gabda96
Чтобы пришел props, надо в mapStateToProps его передать, у вас там передается null.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы