我有一个基于反应的网站,它本质上是一个用户验证前端。我们的表格之一是注册表单,我们正在尝试在其上添加 CAPTCHA 功能。现在的问题是我们必须使用我们无法更改的内部 CAPCHA 例程(当然,如果没有大量繁文缛节和数周的延迟)。
所以我有一个场景,我有一个表单(我们使用 Formik),并且在表单中我必须嵌入一个隐藏的文本框和一个 div,我们的 CAPTCHA 系统的 JS 使用购买覆盖 div 并在隐藏的地方放置一些值然后用于稍后在流程中调用 API 的框。CAPTCHA JS 也将自己放入表单的 onSubmit 中。
无论如何,我的问题是隐藏字段是由 JS 例程设置的,因此反应的绑定机制没有涵盖。因此,如果我更改其中一个普通字段或提交表单,那么隐藏文本框的值将设置为“”——大概是因为它的值被设置回表单认为它应该是的值——我该如何避免这种情况?提交表单时,我需要访问普通字段和此隐藏字段。
一些示例代码可能会使它更清晰:
render() {
const { apiError } = this.props;
return (
<div>
<Formik
initialValues={{
firstName: '',
lastName: '',
email: '',
password: '',
confirmPassword: '',
newsletter: false,
legal: false
}}
validate={this.validate}
onSubmit={this.handleSubmit}
>
{({
errors,
touched,
values,
isSubmitting,
handleSubmit,
setStatus,
status = { submitedWithEmptyInputs: false, submited: false },
}) => (
<div>
<div>
{apiError &&
status.submited &&
apiError === 409 && (
<GenericError>Email address exists</GenericError>
)}
{apiError &&
status.submited &&
apiError !== 409 && (
<GenericError>
Sorry we couldn't process your request. Please check all
inputs.
</GenericError>
)}
</div>
<Form onSubmit={handleSubmit} noValidate>
<InputField
label="First Name"
type="text"
id="firstName"
name="firstName"
value={values.firstName}
error={values.firstName && errors.firstName}
>
{status.submitedWithEmptyInputs &&
errors.firstName && (
<ErrorMessage className="error">
{errors.firstName}
</ErrorMessage>
)}
{status.submitedWithEmptyInputs &&
errors.firstName && (
<ErrorIcon className="error">
<Icon icon={ICONS.ERROR} size="20px" />
</ErrorIcon>
)}
</InputField>
....
....
<div id="challenger" />
<input type="hidden" name="cid" id="cid" value="" />
<Button
text="Create your ID"
primary
width="100%"
type="submit"
id="submit"
loading={this.props.registering}
disabled={isSubmitting}
onClick={() => {
if (
!values.firstName ||
!values.lastName ||
!values.email ||
!values.password ||
!values.confirmPassword ||
!values.legal
) {
setStatus({ submitedWithEmptyInputs: true });
}
}}
/>
</FormActions>
</Form>