Как запустить setSubmitting () вне обработчика отправки? - PullRequest
0 голосов
/ 16 ноября 2018

Я пытаюсь реализовать подход, описанный в https://www.youtube.com/watch?v=5gl3cCB_26M,, где все действия Redux являются просто обычными объектами (как и предполагалось), а вызовы API выполняются промежуточным ПО.

при этом отправленные действия больше не являются громкими и не могут вернуть Promise.Так что я не смогу использовать Formik setSubmitting (чтобы установить флаг isSubmitting в false) внутри обработчика отправки, как примеры кода в документах Formik и другие учебники, которые я нашел.

Я решил эту проблему довольно уродливо, сохранив ссылку на setSubmitting, чтобы запустить ее позже, внутри componentDidUpdate:

import React, { Component } from 'react'
import { Redirect } from 'react-router-dom'

import LoginForm from 'path/to/LoginForm'
import validationSchema from 'path/to/LoginForm/validationSchema'

import { login } from 'path/to/actionCreators'

const initialValues = {
  email: '',
  password: '',
}

class LoginPage extends Component {
  componentDidUpdate() {
    const { auth } = this.props

    if (!auth.isProcessing && this.setSubmitting) {
      this.setSubmitting(false)
    }
  }

  onSubmit = (values, { setSubmitting }) => {
    const { dispatch } = this.props

    dispatch(login(values)))
    this.setSubmitting = setSubmitting
  }

  render() {
    const { auth } = this.props
    if (auth.user.uid) {
      return <Redirect push to="/" />
    }

    return (
      <div className="login-panel">
        <h1>Login</h1>

        <Formik
          initialValues={initialValues}
          onSubmit={this.onSubmit}
          render={LoginForm}
          validationSchema={validationSchema}
        />
      </div>
    )
  }
}

const mapStateToProps = state => ({
  auth: state.auth,
})

export default connect(mapStateToProps)(LoginPage)

Как я могу сделать это более «элегантно»"путь?

Ответы [ 3 ]

0 голосов
/ 20 ноября 2018

Вы можете реализовать обратные вызовы.Просто вызовите обратный вызов onSuccess или onError в промежуточном программном обеспечении и обработайте их в своем компоненте.

// component.js
class LoginPage extends Component {

  // ...

  onSubmit = (values, { setSubmitting }) => {
    const { dispatch } = this.props

    setSubmitting(true);
    dispatch(
      login(
        values,
        () => setSubmitting(false),
        (message) => {
          this._handleErrorMessage(message);
          setSubmitting(false);
        },
      )
    );
  }
}

// actions.js
function loginAction(payload, onSuccess, onError) {
  return {
    type: LOGIN,
    payload,
    onSuccess,
    onError,
  }
}

// middleware.js
function handleLogin(action) {
  const { payload, onSuccess, onError } = action;
  try {
    // login...
    onSuccess('hurray!');
  } catch(error) {
    const { message } = error;
    onError(message);
  }
}
0 голосов
/ 04 июля 2019

Другой подход заключается в использовании ref для компонента <Formik/> (выпущено в Реакте 16.3)

class NewComponent extends Component {
  formikRef = React.createRef()

  render() {
    <Formik
      ref={this.formikRef}
      ..
      ..
    />
  }

  onButtonClick() {
    this.formikRef.current.setSubmitting(false);
  }
}
0 голосов
/ 16 ноября 2018

Если бы компонент Formik мог принять isSubmitting в качестве реквизита, он мог бы быть реализован гораздо более элегантно.Сейчас это не так (см. источник ).Это было бы отличным дополнением для команды Formik.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...