提交反应表格未提交的按钮
我正在尝试使用React.js和Formik制作注册表格。我的提交按钮可以正确显示,但是当我尝试通过单击“提交”按钮提交信息时,什么也不会发生。请告知我如何解决此问题。提前致谢。
registrationform.js:
import React from 'react';
import { Formik, Form } from 'formik';
import * as yup from 'yup';
import FormikControl from './FormikControl';
import classes from './Registration.module.css';
function Registrationform() {
const options = [
{ key: 'Email', value: 'emailmoc' },
{ key: 'Telephone', vlaue: 'telephonemoc' }
];
const initialValues = {
email: '',
password: '',
confirmPassword: '',
modeOfContact: '',
phone: ''
};
const validationSchema = yup.object({
email: yup.string().email('Invalid email format').required('Required'),
password: yup.string().required('Required'),
confirmPassword: yup
.string()
.oneOf([yup.ref('password'), ''], 'Passwords must match')
.required('required'),
modeOfContact: yup.string().required('Required'),
phone: yup.string().when('modeOfContact', {
is: 'telephonemoc',
then: yup.string().required('Required')
})
});
const onSubmit = (values) => {
console.log('Form data', values);
};
return (
<div>
<h1>Registration</h1>
<Formik
initialValues={initialValues}
validationSchema={validationSchema}
onSubmit={onSubmit}
>
{(formik) => {
return (
<Form className={classes.Registrationform}>
<FormikControl
control="input"
type="email"
label="Email"
name="email"
/>
<FormikControl
control="input"
type="password"
label="Password"
name="password"
/>
<FormikControl
control="input"
type="password"
label="Confirm Password"
name="confirmPassword"
/>
<FormikControl
control="input"
type="text"
label="Phone number"
name="phone"
/>
<label>Mode of Contact</label>
<div className="radio">
<label>
<input type="radio" value="Phone" options={options} />
Phone
</label>
</div>
<div className="radio">
<label>
<input type="radio" value="Email" options={options} />
Email
</label>
</div>
<button type="submit" disabled={!formik.isValid}>
Submit
</button>
</Form>
);
}}
</Formik>
</div>
);
}
export default Registrationform;
registration.module.css:
.Registrationform{
margin:auto;
padding-top: 50px;
width:360px;
}
.Registrationform > label {
font-weight: bold;
display: flex;
margin-bottom: 10px;
font-size: 18px;
}
.Registrationform > input {
margin-bottom: 10px;
font-weight: bold;
display: inline-flex;
margin-right: 20px;
border-radius: 6px;
outline:none;
border: none;
border: 1px solid #1E90FF;
}
.Registrationform > button{
margin-top: 10px;
width: 425px;
height: 35px;
border-radius: 6px;
outline:none;
border: none;
border: 1px solid #1E90FF;
background-color: #1E90FF;
color: white;
font-size: 18px;
}
h1{
margin-top: 50px;
margin-bottom: 0;
padding-bottom: 0;
}
formikcontainer:
import React from 'react';
import { Formik, Form } from 'formik';
import * as Yup from 'yup';
import FormikControl from './FormikControl';
function FormikContainer() {
const initialValues = {
email: '',
password: ''
};
const validationschema = Yup.object({
email: Yup.string().required('Required')
});
const onSubmit = (values) => console.log('Form data', values);
return (
<div>
<Formik
initialValues={initialValues}
validationschema={validationschema}
onSubmit={onSubmit}
>
{(formik) => (
<Form>
<FormikControl
control="input"
type="email"
label="Email"
name="email"
/>
<FormikControl
control="input"
type="password"
label="Password"
name="password"
/>
<button type="submit">Submit</button>
</Form>
)}
</Formik>
</div>
);
}
export default FormikContainer;
formikcontrol:
import React from 'react';
function FormikControl({ control, id, label, ...rest }) {
return (
<>
{control === 'input' && <label htmlFor={id}>{label}</label>}
<input id={id} {...rest} />
</>
);
}
export default FormikControl;
app.js:
import React from 'react';
import './App.css';
import FormikContainer from './components/FormikContainer';
import LoginForm from './components/LoginForm';
import Registrationform from './components/RegistrationForm';
function App() {
return (
<div>
<LoginForm />
<Registrationform />
</div>
);
}
export default App;
I am trying to make a registration form using React.js and Formik. My submit button displays correctly but when I try to submit the information by clicking on the submit button nothing happens. Please advise how I can fix this. Thanks in advance.
RegistrationForm.js:
import React from 'react';
import { Formik, Form } from 'formik';
import * as yup from 'yup';
import FormikControl from './FormikControl';
import classes from './Registration.module.css';
function Registrationform() {
const options = [
{ key: 'Email', value: 'emailmoc' },
{ key: 'Telephone', vlaue: 'telephonemoc' }
];
const initialValues = {
email: '',
password: '',
confirmPassword: '',
modeOfContact: '',
phone: ''
};
const validationSchema = yup.object({
email: yup.string().email('Invalid email format').required('Required'),
password: yup.string().required('Required'),
confirmPassword: yup
.string()
.oneOf([yup.ref('password'), ''], 'Passwords must match')
.required('required'),
modeOfContact: yup.string().required('Required'),
phone: yup.string().when('modeOfContact', {
is: 'telephonemoc',
then: yup.string().required('Required')
})
});
const onSubmit = (values) => {
console.log('Form data', values);
};
return (
<div>
<h1>Registration</h1>
<Formik
initialValues={initialValues}
validationSchema={validationSchema}
onSubmit={onSubmit}
>
{(formik) => {
return (
<Form className={classes.Registrationform}>
<FormikControl
control="input"
type="email"
label="Email"
name="email"
/>
<FormikControl
control="input"
type="password"
label="Password"
name="password"
/>
<FormikControl
control="input"
type="password"
label="Confirm Password"
name="confirmPassword"
/>
<FormikControl
control="input"
type="text"
label="Phone number"
name="phone"
/>
<label>Mode of Contact</label>
<div className="radio">
<label>
<input type="radio" value="Phone" options={options} />
Phone
</label>
</div>
<div className="radio">
<label>
<input type="radio" value="Email" options={options} />
Email
</label>
</div>
<button type="submit" disabled={!formik.isValid}>
Submit
</button>
</Form>
);
}}
</Formik>
</div>
);
}
export default Registrationform;
Registration.module.css:
.Registrationform{
margin:auto;
padding-top: 50px;
width:360px;
}
.Registrationform > label {
font-weight: bold;
display: flex;
margin-bottom: 10px;
font-size: 18px;
}
.Registrationform > input {
margin-bottom: 10px;
font-weight: bold;
display: inline-flex;
margin-right: 20px;
border-radius: 6px;
outline:none;
border: none;
border: 1px solid #1E90FF;
}
.Registrationform > button{
margin-top: 10px;
width: 425px;
height: 35px;
border-radius: 6px;
outline:none;
border: none;
border: 1px solid #1E90FF;
background-color: #1E90FF;
color: white;
font-size: 18px;
}
h1{
margin-top: 50px;
margin-bottom: 0;
padding-bottom: 0;
}
FormikContainer:
import React from 'react';
import { Formik, Form } from 'formik';
import * as Yup from 'yup';
import FormikControl from './FormikControl';
function FormikContainer() {
const initialValues = {
email: '',
password: ''
};
const validationschema = Yup.object({
email: Yup.string().required('Required')
});
const onSubmit = (values) => console.log('Form data', values);
return (
<div>
<Formik
initialValues={initialValues}
validationschema={validationschema}
onSubmit={onSubmit}
>
{(formik) => (
<Form>
<FormikControl
control="input"
type="email"
label="Email"
name="email"
/>
<FormikControl
control="input"
type="password"
label="Password"
name="password"
/>
<button type="submit">Submit</button>
</Form>
)}
</Formik>
</div>
);
}
export default FormikContainer;
FormikControl:
import React from 'react';
function FormikControl({ control, id, label, ...rest }) {
return (
<>
{control === 'input' && <label htmlFor={id}>{label}</label>}
<input id={id} {...rest} />
</>
);
}
export default FormikControl;
App.js:
import React from 'react';
import './App.css';
import FormikContainer from './components/FormikContainer';
import LoginForm from './components/LoginForm';
import Registrationform from './components/RegistrationForm';
function App() {
return (
<div>
<LoginForm />
<Registrationform />
</div>
);
}
export default App;
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
您需要将Formik的
handlesubmit
函数绑定到form> form
onsubmit
event侦听器。将OnSubmit Prop添加到下面的
form
,或将按钮代码更改为(formik doc中未提及此方法),
此处更多地在 form api and handleseubmit
href =“ https://formik.org/docs/api/formik#handlesubmit-e-reactformeventhtmlformelement-- void @Malik-Hassam的答案:
您缺少验证模式中的密码字段。
You need to bind the
handleSubmit
function of formik toForm
onSubmit
event listener.add the onSubmit prop to the
Form
as belowOr change your button code to (This approach is not mentioned in the formik doc)
Here is more on Form API and handleSubmit
Update
With respect to the @malik-hassam's answer:
You are missing the password field in validation schema.
没有密码验证。
尝试使用此。
There is missing password validation.
try use this.
请在此处找到您的代码工作演示与登录组件一样
Pls find your code working demo here link and same as you can do for login component
是的,让我添加一个代码示例。您可以使用此。
Yes let me add an example of code. you can use this.
enter link description here