reactjs - Formik 表单不会在 return 按键时触发提交
reactjs - Formik form does not fire submit on return key press
我使用 Formik 在 React 中编写了以下表单:
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't have an account? )
<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 键提交表单时,它会失败赶上事件。我尝试在 <form>
元素的 onSubmit
道具中记录事件,但在 Enter 按下时根本不会触发任何事件。同样的表格以前是使用 redux-form
编写的,Return 关键功能正常工作。
我最初认为这可能是由于异步表单处理造成的,但我切换到常规同步函数但它并没有正常工作。
有没有人经历过类似的事情,如果有,请分享任何修复。
谢谢!
也许尝试将 children 道具与 Formik 一起使用,如下所示:https://jaredpalmer.com/formik/docs/api/formik#children-reactreactnode-props-formikprops-values-reactnode
并删除包裹表单的表单元素。或者禁用表单的默认行为。这就是拦截输入按键行为的原因。
我发现解决这个问题的最好方法是在 HTML Form Element 的 onKeyDown 事件中调用 handleSubmit() 方法,它是 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>
我能够通过删除您在 SimpleInput 组件中应用的 {...rest}
道具传播在您的 Codesandbox 上解决这个问题。这添加了一些看起来会干扰标准表单字段行为的时髦属性。
您可以在此处查看正确的 submit-on-enter 行为:https://codesandbox.io/s/dark-star-r0liq
在我自己的代码中,我使用的是标准 HTML <form>
而不是 Formik <Form>
,所以当我 运行 遇到这个问题时,我不得不确保我的提交按钮具有 type="submit"
属性,以及连接到 Formik 的 handleSubmit
方法的 onClick
处理程序。然后 submit-on-enter 行为开始起作用。
<button
onClick={formProps.handleSubmit}
type="submit"
/>
我使用 Formik 在 React 中编写了以下表单:
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't have an account? )
<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 键提交表单时,它会失败赶上事件。我尝试在 <form>
元素的 onSubmit
道具中记录事件,但在 Enter 按下时根本不会触发任何事件。同样的表格以前是使用 redux-form
编写的,Return 关键功能正常工作。
我最初认为这可能是由于异步表单处理造成的,但我切换到常规同步函数但它并没有正常工作。
有没有人经历过类似的事情,如果有,请分享任何修复。
谢谢!
也许尝试将 children 道具与 Formik 一起使用,如下所示:https://jaredpalmer.com/formik/docs/api/formik#children-reactreactnode-props-formikprops-values-reactnode
并删除包裹表单的表单元素。或者禁用表单的默认行为。这就是拦截输入按键行为的原因。
我发现解决这个问题的最好方法是在 HTML Form Element 的 onKeyDown 事件中调用 handleSubmit() 方法,它是 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>
我能够通过删除您在 SimpleInput 组件中应用的 {...rest}
道具传播在您的 Codesandbox 上解决这个问题。这添加了一些看起来会干扰标准表单字段行为的时髦属性。
您可以在此处查看正确的 submit-on-enter 行为:https://codesandbox.io/s/dark-star-r0liq
在我自己的代码中,我使用的是标准 HTML <form>
而不是 Formik <Form>
,所以当我 运行 遇到这个问题时,我不得不确保我的提交按钮具有 type="submit"
属性,以及连接到 Formik 的 handleSubmit
方法的 onClick
处理程序。然后 submit-on-enter 行为开始起作用。
<button
onClick={formProps.handleSubmit}
type="submit"
/>