responsejs - форма Formik не запускается при нажатии клавиши возврата - PullRequest
0 голосов
/ 24 января 2019

У меня есть следующая форма, написанная на React с использованием Formik:

import React, { FunctionComponent } from 'react';
import { NavLink } from 'react-router-dom';
import { object, string } from 'yup';
import { Formik, FormikActions, Field, FormikProps } from 'formik';
import SimpleInput from './Fields/SimpleInput';
import FieldError from './Fields/FieldError';

interface FormValues {
  email: string;
  password: string;
}
interface OwnProps {
  onSubmit: (data: FormValues) => any;
}

const validationSchema = object().shape({
  email: string()
    .email('Please enter a valid email address')
    .required('Email is a required field'),
  password: string()
    .min(8)
    .required('Password is a required field'),
});

type Props = OwnProps;

const LoginForm: FunctionComponent<Props> = ({ onSubmit }) => {
  const initialValues = {
    email: '',
    password: '',
  };

  const onFormSubmit = async (values: FormValues, { setSubmitting }: FormikActions<FormValues>) => {
    await onSubmit(values);
    setSubmitting(false);
  };

  return (
    <Formik
      onSubmit={onFormSubmit}
      initialValues={initialValues}
      validationSchema={validationSchema}
      render={({ handleSubmit, isSubmitting }: FormikProps<FormValues>) => (
        <form className="ipx-form sign" onSubmit={handleSubmit}>
          <h1>Sign in</h1>
          <div className="ipx-register-here">
            ( Don&#39;t have an account? ) &nbsp;
            <NavLink to="/register">Register here</NavLink>
          </div>
          <br />
          <Field name="email" type="email" component={SimpleInput} label="Email Address" placeholder="Email" />
          <FieldError name="email" />
          <br />
          <br />
          <div className="fields">
            <Field name="password" type="password" component={SimpleInput} label="Password" placeholder="Password" />
            <FieldError name="password" />
          </div>
          <br />
          Forgot <NavLink to="/forgot-password">password?</NavLink>
          <br />
          <button className="button ipx-submit-button" id="ipx-login-submit" type="submit" disabled={isSubmitting}>
            <span className="ladda-label">Sign in</span>
          </button>
        </form>
      )}
    />
  );
};

export default LoginForm;

Что работает нормально, если я нажимаю кнопку для отправки формы (она отправляет действие Redux и регистрирует пользователя), однако, когда я пытаюсь отправить форму нажатием клавиши Return / Enter, она не может перехватить событие. Я попытался записать событие в подпункт onSubmit элемента <form>, но ни одно событие не вызывалось при нажатии Enter вообще. Эта же форма была ранее написана с использованием redux-form, и функциональность клавиши возврата работала как надо.

Сначала я думал, что это может быть связано с асинхронной обработкой форм, но я переключился на обычную синхронную функцию, и она также не работала.

Кто-нибудь когда-либо испытывал нечто подобное, и если да, то поделитесь, пожалуйста, любыми исправлениями.

Спасибо!

Codesandbox

Ответы [ 3 ]

0 голосов
/ 17 июля 2019

Лучший способ найти этот пейзаж - это вызвать метод handleSubmit () внутри события onKeyDown элемента формы HTML, который является потомком Formik.

      <Formik
        initialValues={{
          login: '',
          senha: ''
        }}
        onSubmit={(values, { setErrors }) => {
          this.submitSignin(values, setErrors);
        }}
      >
        {props => {
          const {
            values,
            handleChange,
            handleBlur,
            handleSubmit,
          } = props;
          return (
            <form 
              onSubmit={handleSubmit} 
              onKeyDown={(e) => {
                if (e.key === 'Enter') {
                  handleSubmit();
                }
              }}>
             <input 
               id="login"
               value={values.login}
               onChange={handleChange}
               onBlur={handleBlur} />
             <input 
               id="senha"
               value={values.senha}
               onChange={handleChange}
               onBlur={handleBlur} />
            </form>
          }
        </Formik>
0 голосов
/ 18 июля 2019

Я смог решить эту проблему на вашем Codesandbox, удалив спред {...rest}, который вы использовали в компоненте SimpleInput. Это добавило некоторые прикольные атрибуты, которые, казалось, мешали стандартному поведению поля формы.

Вы можете увидеть правильное поведение отправки при входе здесь: https://codesandbox.io/s/dark-star-r0liq

В своем собственном коде я использую стандартный HTML <form> вместо Formik <Form>, поэтому, когда я столкнулся с этой проблемой, я должен был убедиться, что у моей кнопки отправки есть атрибут type="submit", а также обработчик onClick подключен к методу Formik handleSubmit. Затем стало работать поведение отправки при входе.

<button onClick={formProps.handleSubmit} type="submit" />

Соответствующая официальная проблема репо: https://github.com/jaredpalmer/formik/issues/1418

0 голосов
/ 12 апреля 2019

Возможно, попробуйте использовать дочернюю подпорку с Formik, как показано здесь: https://jaredpalmer.com/formik/docs/api/formik#children-reactreactnode-props-formikprops-values-reactnode

И удалите элемент формы, обертывающий форму.Или отключите поведение формы по умолчанию.Вот что перехватывает поведение ввода с клавиатуры.

...