dalv_happy
@dalv_happy

Как сделать последовательный вызов React Redux?

Добрый день!
Есть компонента с формами и компонента кнопка (Button). Эта кнопка принимает параметр куда нужно редиректить человека после клика, но вот проблема теперь при клике на кнопку мне нужно сначала отправить запрос, через промисы получить ответ и только после успешного ответа делать редирект.
Вопросы:
  1. Как моей функции передать параметры из хранилища?
  2. Как в экшену, который диспатчит изменения вернуть промис для того чтобы он понимал когда редиректить?
Страница
/* Дополнительная информация для совершения платежа */
import React from 'react';
import { connect } from 'react-redux';
import PropTypes from 'prop-types';

import {
  childrenWhiteContentStyle, contentUpStyle, payBtnContainerStyle,
} from '../../styles/GlobalStyle';
import TextFieldLabel from '../forms/TextFieldLabel';
import { choosePayment } from '../routing/Paths';
import Button from '../forms/Button';

const AdditionalPaymentInformation = ({
  fio, onSetFio,
  phone, onSetPhone,
  isBigPayment, onChange,
}) => (
  <div className={childrenWhiteContentStyle}>
    <div className={contentUpStyle}>
      <TextFieldLabel
        type="tel"
        value={phone}
        onChange={onSetPhone}
        label={isBigPayment ? 'Мобильный телефон' : 'Введите номер мобильного телефона'}
        mask="+9 (999) 999-99-99"
        placeholder="+7"
        helper={isBigPayment ? 'Укажите номер телефона, чтобы перейти к оплате' : 'Специалист службы поддержки свяжется с вами, если возникнут сложности с проведением оплаты'}
      />
    </div>
    <div className={payBtnContainerStyle}>
      <Button
        value="Продолжить"
        to={choosePayment}
        onChange={() => onChange(fio, phone)}
      />
    </div>
  </div>
);

AdditionalPaymentInformation.propTypes = {
  phone: PropTypes.string.isRequired,
  onSetPhone: PropTypes.func.isRequired,
  onChange: PropTypes.func.isRequired,
};

export default connect(
  state => ({
    phone: state.additionalPaymentInformation.phone,
  }),
  dispatch => ({
    onSetPhone: (event) => {
      dispatch({ type: 'SET_ADD_PAY_PHONE', payload: event.target.value });
    },
    onChange: (fio, phone) => {
      console.log(fio, phone);
      // dispatch({ type: 'SET_ADD_PAY_PHONE', payload: '' });
    },
  }),
)(AdditionalPaymentInformation);


Button
import React from 'react';
import { withRouter } from 'react-router-dom';
import PropTypes from 'prop-types';

import { payBtnStyle, iconBtnStyle } from '../../styles/GlobalStyle';
import payIcon from '../../img/button/icon-pay.svg';
import disabledPayIcon from '../../img/button/icon-pay-disabled.svg';

const Button = withRouter(({
  history, value, to, icon, disabled,
}) => {
  const redirectTo = () => {
    history.push(to);
  };
  return (
    <button
      type="button"
      className={payBtnStyle}
      onClick={redirectTo}
      disabled={disabled}
    >
      {icon === 'pay' && (
        <img src={disabled ? disabledPayIcon : payIcon} alt="" className={iconBtnStyle} />
      )}
      {value}
    </button>
  );
});

Button.propTypes = {
  value: PropTypes.string.isRequired,
  to: PropTypes.string.isRequired,
  icon: PropTypes.string,
  disabled: PropTypes.bool,
  onChange: PropTypes.func,
};

export default (Button);
  • Вопрос задан
  • 673 просмотра
Решения вопроса 1
rockon404
@rockon404 Куратор тега React
Frontend Developer
Подключаем redux-thunk. Пишем async action:
function fetchSomeData(params) {
  return async (dispatch, getState) {
    try {
      const { data } = await Api.fetchSomeData(params);
      dispatch(fetchSomeDataSuccess(data));
      // для доступа к store можно использовать getState
      return data;
    } catch (e) {
      dispatch(fetchSomeDataFail(e));
      return e;
    }
  }
}

Подключаем к компоненту:
const mapStateToProps = state => ({ ... });
const mapDispatchToProps = {
  fetchSomeData,
};

export default connect(mapStateToProps, mapDispatchToProps)(SomeComponent);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы
22 нояб. 2024, в 03:54
1500 руб./за проект
22 нояб. 2024, в 02:56
10000 руб./за проект
22 нояб. 2024, в 00:55
500 руб./за проект