Lecture Notes Of Day 21 - React Forms Advanced
Objective
In this lecture, we will explore advanced techniques for
handling forms in React. We will focus on:
Form validation
Displaying error messages
Creating dynamic form fields
By the end of this session, you will be able to build a
complex form that includes validation and dynamic fields.
Introduction to Forms in React
Forms are a crucial part of web applications, allowing users
to input data. In React, forms can be managed using controlled components,
where form data is handled by the component's state.
Controlled vs. Uncontrolled Components
Controlled Components: The form data is handled by the React
component's state. The input fields are controlled by React.
Uncontrolled Components: The form data is handled by the DOM
itself. You can access the data using refs.
For this lecture, we will focus on controlled components, as
they provide better control over form data and validation.
Advanced Form Handling Techniques
1. Form Validation
Form validation is essential to ensure that the data entered
by users meets certain criteria before submission. There are two main types of
validation:
Client-side Validation: Validates data in the browser before
sending it to the server.
Server-side Validation: Validates data on the server after
submission.
Implementing Client-side Validation
To implement client-side validation in React, we can use the
following steps:
Define Validation Rules: Determine what fields are required
and what formats are acceptable (e.g., email format, password strength).
Update State on Input Change: As the user types, update the
state and check for validation.
Display Error Messages: Show error messages when validation
fails.
Example: Basic Validation
jsx
Verify
Open In Editor
Edit
Copy code
import React, { useState } from 'react';
const MyForm = () => {
const [formData,
setFormData] = useState({ email: '', password: '' });
const [errors,
setErrors] = useState({});
const validate = ()
=> {
const newErrors =
{};
if
(!formData.email) {
newErrors.email =
'Email is required';
} else if
(!/\S+@\S+\.\S+/.test(formData.email)) {
newErrors.email =
'Email is invalid';
}
if
(!formData.password) {
newErrors.password = 'Password is required';
} else if
(formData.password.length < 6) {
newErrors.password = 'Password must be at least 6 characters';
}
setErrors(newErrors);
return
Object.keys(newErrors).length === 0;
};
const handleSubmit =
(e) => {
e.preventDefault();
if (validate()) {
console.log('Form
submitted:', formData);
}
};
const handleChange =
(e) => {
const { name, value
} = e.target;
setFormData({
...formData, [name]: value });
};
return (
<form
onSubmit={handleSubmit}>
<div>
<label>Email:</label>
<input
type="email" name="email" value={formData.email}
onChange={handleChange} />
{errors.email &&
<span style={{ color: 'red' }}>{errors.email}</span>}
</div>
<div>
<label>Password:</label>
<input
type="password" name="password" value={formData.password}
onChange={handleChange} />
{errors.password && <span style={{ color: 'red'
}}>{errors.password}</span>}
</div>
<button
type="submit">Submit</button>
</form>
);
};
export default MyForm;
2. Dynamic Form Fields
Dynamic form fields allow users to add or remove fields based
on their input. This is useful for scenarios like adding multiple addresses or
phone numbers.
Implementing Dynamic Fields
To implement dynamic fields, we can use an array in the
component's state to manage the fields.
Example: Adding Dynamic Fields
jsx
Verify
Open In Editor
Edit
Copy code
import React, { useState } from 'react';
const DynamicForm = () => {
const [fields,
setFields] = useState([{ name: '' }]);
const [errors,
setErrors] = useState({});
const handleChange =
(index, e) => {
const newFields =
[...fields];
newFields[index].name = e.target.value;
setFields(newFields);
};
const addField = ()
=> {
setFields([...fields, { name: '' }]);
};
const removeField =
(index) => {
const newFields =
fields.filter((_, i) => i !== index);
setFields(newFields);
};
const handleSubmit =
(e) => {
e.preventDefault();
// Validate fields
here
console.log ('Form
submitted:', fields);
};
return (
<form
onSubmit={handleSubmit}>
{fields.map((field, index) => (
<div
key={index}>
<label>Name:</label>
<input
type="text"
value={field.name}
onChange={(e) => handleChange(index, e)}
/>
<button
type="button" onClick={() =>
removeField(index)}>Remove</button>
</div>
))}
<button
type="button" onClick={addField}>Add Field</button>
<button
type="submit">Submit</button>
</form>
);
};
export default DynamicForm;
Conclusion
In this lecture, we covered advanced form handling techniques
in React, including validation and dynamic form fields. You learned how to
implement client-side validation to ensure data integrity and how to create
dynamic fields that can be added or removed based on user input. These
techniques are essential for building complex forms in modern web applications.
Next Steps
Experiment with different validation rules and dynamic field
scenarios.
Explore libraries like Formik or React Hook Form for more
advanced form handling capabilities. ### Additional Topics for Exploration
3. Using Libraries for Form Management
While building forms from scratch is a great way to
understand the underlying concepts, using libraries can significantly simplify
the process. Two popular libraries for form management in React are:
Formik: A powerful library that helps manage form state,
validation, and submission. It provides a simple API and integrates well with
validation libraries like Yup.
React Hook Form: A lightweight library that leverages React
hooks to manage form state. It is known for its performance and ease of use,
especially with dynamic forms.
Example: Using Formik for Form Handling
jsx
Verify
Open In Editor
Edit
Copy code
import React from 'react';
import { Formik, Form, Field, ErrorMessage } from 'formik';
import * as Yup from 'yup';
const MyFormikForm = () => {
const initialValues =
{ email: '', password: '' };
const
validationSchema = Yup.object({
email:
Yup.string().email('Invalid email format').required('Email is required'),
password:
Yup.string().min(6, 'Password must be at least 6
characters').required('Password is required'),
});
const handleSubmit =
(values) => {
console.log('Form
submitted:', values);
};
return (
<Formik
initialValues={initialValues}
validationSchema={validationSchema}
onSubmit={handleSubmit}
>
<Form>
<div>
<label>Email:</label>
<Field
type="email" name="email" />
<ErrorMessage name="email" component="span"
style={{ color: 'red' }} />
</div>
<div>
<label>Password:</label>
<Field
type="password" name="password" />
<ErrorMessage name="password" component="span"
style={{ color: 'red' }} />
</div>
<button
type="submit">Submit</button>
</Form>
</Formik>
);
};
export default MyFormikForm;
4. Custom Hooks for Form Logic
Creating custom hooks can help encapsulate form logic and
make your components cleaner. For example, you can create a useForm hook that
manages form state, validation, and submission.
Example: Custom Hook for Form Handling
jsx
Verify
Open In Editor
Edit
Copy code
import { useState } from 'react';
const useForm = (initialValues, validate) => {
const [values,
setValues] = useState(initialValues);
const [errors,
setErrors] = useState({});
const handleChange =
(e) => {
const { name, value
} = e.target;
setValues({
...values, [name]: value });
if (validate) {
const
validationErrors = validate({ ...values, [name]: value });
setErrors(validationErrors);
}
};
const handleSubmit =
(e, callback) => {
e.preventDefault();
if (validate) {
const
validationErrors = validate(values);
setErrors(validationErrors);
if
(Object.keys(validationErrors).length === 0) {
callback(values);
}
} else {
callback(values);
}
};
return { values,
errors, handleChange, handleSubmit };
};
export default useForm;
Conclusion
By mastering advanced form handling techniques in React,
including validation, dynamic fields, and leveraging libraries or custom hooks,
you can create robust and user-friendly forms. These skills are essential for
developing modern web applications that require complex user interactions.
Homework Assignment
Create a form using either Formik or React Hook Form that
includes at least three fields with validation.
Implement a dynamic field feature where users can add or
remove fields as needed.
Explore additional validation scenarios, such as asynchronous
validation or conditional fields. ### Homework Assignment (continued)
Document your code and explain the logic behind your
implementation.
Share your form with peers for feedback and suggestions on
improvements.
Consider edge cases in your validation logic and how to
handle them gracefully.
Additional Resources
Formik Documentation
React Hook Form Documentation
Yup Documentation for Validation
Q&A Session
At the end of the lecture, we will have a Q&A session
where you can ask questions about any challenges you faced while implementing
forms or any concepts that need further clarification. Please come prepared
with specific examples or code snippets if you need help.
Final Thoughts
Understanding advanced form handling in React is a valuable
skill that enhances your ability to create interactive and user-friendly
applications. Practice is key, so make sure to experiment with different
techniques and libraries to find what works best for your projects. Happy
coding!
You
WRITE SOME ASSIGNMENTS FROM ABOVE CONCEPT WITH STEP BY STEP
SOLUTIONS with explanation
BLACKBOXAI
Sure! Below are some assignments based on the advanced form
handling techniques discussed in the lecture, along with step-by-step solutions
and explanations.
Assignment 1: Basic Form with Validation
Task
Create a simple login form with two fields: email and password.
Implement client-side validation to ensure:
The email is required and must be in a valid format.
The password is required and must be at least 6 characters
long.
Display error messages below each field if validation fails.
Step-by-Step Solution
Set Up the React Component: Create a new React component
called LoginForm.
jsx
Verify
Open In Editor
Edit
Copy code
import React, { useState } from 'react';
const LoginForm = () => {
const [formData,
setFormData] = useState({ email: '', password: '' });
const [errors,
setErrors] = useState({});
// Validation
function
const validate = ()
=> {
const newErrors =
{};
if
(!formData.email) {
newErrors.email =
'Email is required';
} else if
(!/\S+@\S+\.\S+/.test(formData.email)) {
newErrors.email = 'Email is invalid';
}
if
(!formData.password) {
newErrors.password = 'Password is required';
} else if
(formData.password.length < 6) {
newErrors.password = 'Password must be at least 6 characters';
}
setErrors(newErrors);
return
Object.keys(newErrors).length === 0;
};
const handleChange =
(e) => {
const { name, value
} = e.target;
setFormData({
...formData, [name]: value });
};
const handleSubmit =
(e) => {
e.preventDefault();
if (validate()) {
console.log('Form
submitted:', formData);
}
};
return (
<form
onSubmit={handleSubmit}>
<div>
<label>Email:</label>
<input
type="email" name="email" value={formData.email}
onChange={handleChange} />
{errors.email
&& <span style={{ color: 'red' }}>{errors.email}</span>}
</div>
<div>
<label>Password:</label>
<input
type="password" name="password" value={formData.password}
onChange={handleChange} />
{errors.password
&& <span style={{ color: 'red' }}>{errors.password}</span>}
</div>
<button
type="submit">Submit</button>
</form>
);
};
export default LoginForm;
Explanation:
We use useState to manage the form data and errors.
The validate function checks the input values and sets error
messages accordingly.
The handleChange function updates the state as the user
types.
The handleSubmit function prevents the default form
submission and calls the validate function. If validation passes, it logs the
form data.
Assignment 2: Dynamic Form Fields
Task
Create a form that allows users to add multiple email
addresses. Users should be able to add or remove email fields dynamically.
Implement validation to ensure that each email is in a valid format.
Step-by-Step Solution
Set Up the React Component: Create a new React component
called DynamicEmailForm.
jsx
Verify
Open In Editor
Edit
Copy code
import React, { useState } from 'react';
const DynamicEmailForm = () => {
const [emails, setEmails]
= useState([{ email: '' }]);
const [errors,
setErrors] = useState([]);
const handleChange =
(index, e) => {
const newEmails =
[...emails];
newEmails[index].email = e.target.value;
setEmails(newEmails);
};
const addEmailField =
() => {
setEmails([...emails, { email: '' }]);
};
const
removeEmailField = (index) => {
const newEmails =
emails.filter((_, i) => i !== index);
setEmails(newEmails);
};
const validateEmails
= () => {
const newErrors =
[];
emails.forEach((email, index) => {
if (!email.email)
{
newErrors[index] = 'Email is required';
} else if
(!/\S+@\S+\.\S+/.test(email.email)) {
newErrors[index] = 'Email is invalid';
} else {
newErrors[index]
= '';
}
});
setErrors(newErrors);
return
newErrors.every((error) => error === '');
};
const handleSubmit =
(e) => {
e.preventDefault();
if
(validateEmails()) {
console.log('Form
submitted:', emails);
}
};
return (
<form
onSubmit={handleSubmit}>
{emails.map((emailField, index) => ( <div
key={index}> <label>Email:</label> <input
type="email" value={emailField.email} onChange={(e) =>
handleChange(index, e)} /> {errors[index] && <span style={{
color: 'red' }}>{errors[index]}</span>} <button
type="button" onClick={() =>
removeEmailField(index)}>Remove</button> </div> ))} <button
type="button" onClick={addEmailField}>Add Email</button>
<button type="submit">Submit</button> </form> ); };
export default DynamicEmailForm;
Verify
Open In Editor
Edit
Copy code
2. **Explanation**:
- We maintain an array of email objects in the state.
- The `handleChange` function updates the specific email
field based on the index.
- The `addEmailField` function adds a new email object to the
array.
- The `removeEmailField` function removes an email object
based on the index.
- The `validateEmails` function checks each email for
validity and sets error messages accordingly.
- The `handleSubmit` function validates the emails before
logging the data.
---
## Assignment 3: Form with Formik
### Task
Create a registration form using Formik that includes fields
for username, email, and password. Implement validation using Yup to ensure:
- Username is required.
- Email is required and must be in a valid format.
- Password is required and must be at least 8 characters
long.
### Step-by-Step Solution
1. **Set Up the React Component**:
Create a new React component called `RegistrationForm`.
```jsx
import React from 'react';
import { Formik, Form, Field, ErrorMessage } from 'formik';
import * as Yup from 'yup';
const RegistrationForm = () => {
const initialValues =
{ username: '', email: '', password: '' };
const
validationSchema = Yup.object({
username: Yup.string().required('Username
is required'),
email:
Yup.string().email('Invalid email format').required('Email is required'),
password:
Yup.string().min(8, 'Password must be at least 8
characters').required('Password is required'),
});
const handleSubmit =
(values) => {
console.log('Form
submitted:', values);
};
return (
<Formik
initialValues={initialValues}
validationSchema={validationSchema}
onSubmit={handleSubmit}
>
<Form>
<div>
<label>Username:</label>
<Field
type="text" name="username" />
<ErrorMessage name="username" component="span"
style={{ color: 'red' }} />
</div>
<div>
<label>Email:</label>
<Field
type="email" name="email" />
<ErrorMessage name="email" component="span"
style={{ color: 'red' }} />
</div>
<div>
<label>Password:</label>
<Field
type="password" name="password" />
<ErrorMessage name="password" component="span"
style={{ color: 'red' }} />
</div>
<button
type="submit">Submit</button>
</Form>
</Formik>
);
};
export default RegistrationForm;
Explanation:
We use Formik to manage the form state and handle submission.
The initialValues object defines the initial state of the
form fields.
The validationSchema uses Yup to define validation rules for
each field.
The handleSubmit function logs the form data upon successful
submission.
The Field component is used to create input fields, and
ErrorMessage displays validation errors.
Conclusion
These assignments provide practical experience with advanced
form handling techniques in React. By completing them, you will gain a deeper
understanding of form validation, dynamic fields, and the use of libraries like
Formik and Yup. Make sure to test your forms thoroughly and explore additional
features or enhancements as you become more comfortable with the concepts.
Happy coding! ## Assignment 4: Custom Hook for Form Handling
Task
Create a custom hook called useForm that manages form state
and validation. Use this hook to build a simple contact form with fields for
name, email, and message. Implement validation to ensure:
Name is required.
Email is required and must be in a valid format.
Message is required and must be at least 10 characters long.
Step-by-Step Solution
Create the Custom Hook: Create a new file called useForm.js
and implement the custom hook.
jsx
Verify
Open In Editor
Edit
Copy code
import { useState } from 'react';
const useForm = (initialValues, validate) => {
const [values,
setValues] = useState(initialValues);
const [errors,
setErrors] = useState({});
const handleChange =
(e) => {
const { name, value
} = e.target;
setValues({
...values, [name]: value });
if (validate) {
const
validationErrors = validate({ ...values, [name]: value });
setErrors(validationErrors);
}
};
const handleSubmit =
(e, callback) => {
e.preventDefault();
if (validate) {
const
validationErrors = validate(values);
setErrors(validationErrors);
if
(Object.keys(validationErrors).length === 0) {
callback(values);
}
} else {
callback(values);
}
};
return { values,
errors, handleChange, handleSubmit };
};
export default useForm;
Set Up the Contact Form Component: Create a new React
component called ContactForm that uses the useForm hook.
jsx
Verify
Open In Editor
Edit
Copy code
import React from 'react';
import useForm from './useForm';
const validate = (values) => {
const errors = {};
if (!values.name) {
errors.name = 'Name
is required';
}
if (!values.email) {
errors.email =
'Email is required';
} else if
(!/\S+@\S+\.\S+/.test(values.email)) {
errors.email =
'Email is invalid';
}
if (!values.message)
{
errors.message =
'Message is required';
} else if
(values.message.length < 10) {
errors.message =
'Message must be at least 10 characters';
}
return errors;
};
const ContactForm = () => {
const { values,
errors, handleChange, handleSubmit } = useForm(
{ name: '', email:
'', message: '' },
validate
);
const submitForm =
(formData) => {
console.log('Form
submitted:', formData);
};
return (
<form
onSubmit={(e) => handleSubmit(e, submitForm)}>
<div>
<label>Name:</label>
<input
type="text" name="name" value={values.name}
onChange={handleChange} />
{errors.name
&& <span style={{ color: 'red' }}>{errors.name}</span>}
</div>
<div>
<label>Email:</label>
<input
type="email" name="email" value={values.email}
onChange={handleChange} />
{errors.email
&& <span style={{ color: 'red' }}>{errors.email}</span>}
</div>
<div>
<label>Message:</label>
<textarea
name="message" value={values.message} onChange={handleChange} />
{errors.message
&& <span style={{ color: 'red' }}>{errors.message}</span>}
</div>
<button
type="submit">Submit</button>
</form>
);
};
export default ContactForm;
Explanation:
The useForm hook manages the form state and validation logic.
The validate function checks the input values and returns any
errors.
The ContactForm component uses the useForm hook to manage its
state and handle submissions.
The handleChange function updates the state and performs
validation on each input change.
The handleSubmit function prevents the default form
submission and calls the submitForm function if validation passes.
Assignment 5: Form with Asynchronous Validation
Task
Create a registration form that includes fields for username
and email. Implement asynchronous validation to check if the username is
already taken (simulate this with a timeout). Ensure that the email is
validated as well.
Step-by-Step Solution
Set Up the React Component: Create a new React component
called AsyncValidationForm.
jsx
Verify
Open In Editor
Edit
Copy code
import React, { useState } from 'react';
const AsyncValidationForm = () => {
const [formData,
setFormData] = useState({ username: '', email: '' });
const [errors,
setErrors] = useState({});
const [isSubmitting,
setIsSubmitting] = useState(false);
const validate =
async () => {
const newErrors =
{};
if (!formData.username)
{
newErrors.username = 'Username is required';
} else if (await
checkUsernameExists(formData.username)) {
newErrors.username = 'Username is already taken';
}
if
(!formData.email) {
newErrors.email =
'Email is required';
} else if
(!/\S+@\S+\.\S+/.test(formData.email)) {
newErrors.email =
'Email is invalid';
}
setErrors(newErrors);
return
Object.keys(newErrors).length === 0;
};
const
checkUsernameExists = (username) => {
return new Promise((resolve)
=> {
setTimeout(()
=> {
// Simulate a
username check (e.g., from a database)
const takenUser
names = ['user1', 'admin', 'test'];
resolve(takenUser names.includes(username));
}, 1000);
});
};
const handleChange =
(e) => {
const { name, value
} = e.target;
setFormData({
...formData, [name]: value });
};
const handleSubmit =
async (e) => {
e.preventDefault();
setIsSubmitting(true);
if (await
validate()) {
console.log('Form
submitted:', formData);
}
setIsSubmitting(false);
};
return (
<form
onSubmit={handleSubmit}>
<div>
<label>Username:</label>
<input
type="text" name="username" value={formData.username}
onChange={handleChange} />
{errors.username && <span style={{ color: 'red'
}}>{errors.username}</span>}
</div>
<div>
<label>Email:</label>
<input
type="email" name="email" value={formData.email}
onChange={handleChange} />
{errors.email
&& <span style={{ color: 'red' }}>{errors.email}</span>}
</div>
<button
type="submit" disabled={isSubmitting}>Submit</button>
{isSubmitting
&& <p>Checking username...</p>}
</form>
);
};
export default AsyncValidationForm;
Explanation:
The validate function checks if the username is taken by
calling the checkUsernameExists function, which simulates an asynchronous check
with a timeout.
The handleChange function updates the form data as the user
types.
The handleSubmit function prevents the default submission,
validates the form asynchronously, and logs the data if validation passes.
A loading message is displayed while the username is being
checked.
Conclusion
These assignments provide a comprehensive understanding of
form handling in React, covering validation, dynamic fields, the use of
libraries, custom hooks, and asynchronous validation. Completing these tasks
will enhance your skills in building robust forms for web applications. Make
sure to test your implementations thoroughly and explore additional features or
enhancements as you become more comfortable with the concepts. Happy coding! ##
Assignment 1: Basic Form with Validation
Task
Create a simple login form with two fields: email and
password. Implement client-side validation to ensure:
The email is required and must be in a valid format.
The password is required and must be at least 6 characters
long.
Display error messages below each field if validation fails.
Step-by-Step Solution
Set Up the React Component: Create a new React component
called LoginForm.
jsx
Verify
Open In Editor
Edit
Copy code
import React, { useState } from 'react';
const LoginForm = () => {
const [formData,
setFormData] = useState({ email: '', password: '' });
const [errors,
setErrors] = useState({});
const validate = ()
=> {
const newErrors =
{};
if
(!formData.email) {
newErrors.email =
'Email is required';
} else if
(!/\S+@\S+\.\S+/.test(formData.email)) {
newErrors.email =
'Email is invalid';
}
if
(!formData.password) {
newErrors.password = 'Password is required';
} else if
(formData.password.length < 6) {
newErrors.password = 'Password must be at least 6 characters';
}
setErrors(newErrors);
return
Object.keys(newErrors).length === 0;
};
const handleChange =
(e) => {
const { name, value
} = e.target;
setFormData({
...formData, [name]: value });
};
const handleSubmit =
(e) => {
e.preventDefault();
if (validate()) {
console.log('Form
submitted:', formData);
}
};
return (
<form
onSubmit={handleSubmit}>
<div>
<label>Email:</label>
<input
type="email" name="email" value={formData.email}
onChange={handleChange} />
{errors.email
&& <span style={{ color: 'red' }}>{errors.email}</span>}
</div>
<div>
<label>Password:</label>
<input
type="password" name="password" value={formData.password}
onChange={handleChange} />
{errors.password && <span style={{ color: 'red'
}}>{errors.password}</span>}
</div>
<button
type="submit">Submit</button>
</form>
);
};
export default LoginForm;
Explanation:
We use useState to manage the form data and errors.
The validate function checks the input values and sets error
messages accordingly.
The handleChange function updates the state as the user
types.
The handleSubmit function prevents the default form
submission and calls the validate function. If validation passes, it logs the
form data.
Assignment 2: Dynamic Form Fields
Task
Create a form that allows users to add multiple email
addresses. Users should be able to add or remove email fields dynamically.
Implement validation to ensure that each email is in a valid format.
Step-by-Step Solution
Set Up the React Component: Create a new React component
called DynamicEmailForm.
jsx
Verify
Open In Editor
Edit
Copy code
import React, { useState } from 'react';
const DynamicEmailForm = () => {
const [emails, setEmails]
= useState([{ email: '' }]);
const [errors,
setErrors] = useState([]);
const handleChange =
(index, e) => {
const newEmails =
[...emails];
newEmails[index].email = e.target.value;
setEmails(newEmails);
};
const addEmailField =
() => {
setEmails([...emails, { email: '' }]);
};
const
removeEmailField = (index) => {
const newEmails =
emails.filter((_, i) => i !== index);
setEmails(newEmails);
};
const validateEmails
= () => {
const newErrors =
[];
emails.forEach((email, index) => {
if (!email.email)
{
newErrors[index] = 'Email is required';
} else if
(!/\S+@\S+\.\S+/.test(email.email)) {
newErrors[index] = 'Email is invalid';
} else {
newErrors[index]
= '';
}
});
setErrors(newErrors);
return
newErrors.every((error) => error === '');
};
const handleSubmit =
(e) => {
e.preventDefault();
if
(validateEmails()) {
console.log('Form
submitted:', emails);
}
};
return (
<form
onSubmit={handleSubmit}>
{emails.map((emailField, index ) => (
<div
key={index}>
<label>Email:</label>
<input
type="email"
value={emailField.email}
onChange={(e)
=> handleChange(index, e)}
/>
{errors[index] && <span style={{ color: 'red'
}}>{errors[index]}</span>}
<button
type="button" onClick={() =>
removeEmailField(index)}>Remove</button>
</div>
))}
<button
type="button" onClick={addEmailField}>Add Email</button>
<button
type="submit">Submit</button>
</form>
);
};
export default DynamicEmailForm;
Explanation:
We maintain an array of email objects in the state.
The handleChange function updates the specific email field
based on the index.
The addEmailField function adds a new email object to the
array.
The removeEmailField function removes an email object based
on the index.
The validateEmails function checks each email for validity
and sets error messages accordingly.
The handleSubmit function validates the emails before logging
the data.
Assignment 3: Form with Formik
Task
Create a registration form using Formik that includes fields
for username, email, and password. Implement validation using Yup to ensure:
Username is required.
Email is required and must be in a valid format.
Password is required and must be at least 8 characters long.
Step-by-Step Solution
Set Up the React Component: Create a new React component
called RegistrationForm.
jsx
Verify
Open In Editor
Edit
Copy code
import React from 'react';
import { Formik, Form, Field, ErrorMessage } from 'formik';
import * as Yup from 'yup';
const RegistrationForm = () => {
const initialValues =
{ username: '', email: '', password: '' };
const
validationSchema = Yup.object({
username:
Yup.string().required('Username is required'),
email:
Yup.string().email('Invalid email format').required('Email is required'),
password:
Yup.string().min(8, 'Password must be at least 8
characters').required('Password is required'),
});
const handleSubmit =
(values) => {
console.log('Form
submitted:', values);
};
return (
<Formik
initialValues={initialValues}
validationSchema={validationSchema}
onSubmit={handleSubmit}
>
<Form>
<div>
<label>Username:</label>
<Field
type="text" name="username" />
<ErrorMessage name="username" component="span"
style={{ color: 'red' }} />
</div>
<div>
<label>Email:</label>
<Field
type="email" name="email" />
<ErrorMessage name="email" component="span"
style={{ color: 'red' }} />
</div>
<div>
<label>Password:</label>
<Field
type="password" name="password" />
<ErrorMessage name="password" component="span"
style={{ color: 'red' }} />
</div>
<button
type="submit">Submit</button>
</Form>
</Formik>
);
};
export default RegistrationForm;
Explanation:
We use Formik to manage the form state and handle submission.
The initialValues object defines the initial state of the
form fields.
The validationSchema uses Yup to define validation rules for
each field.
The handleSubmit function logs the form data upon successful
submission.
The Field component is used to create input fields, and
ErrorMessage displays validation errors.
Assignment 4: Custom Hook for Form Handling
Task
Create a custom hook called useForm that manages form state
and validation. Use this hook to build a simple contact form with fields for
name, email, and message. Implement validation to ensure:
Name is required.
Email is required and must be in a valid format.
Message is required and must be at least 10 characters long.
Step-by-Step Solution
Create the Custom Hook: Create a new file called useForm.js
and implement the custom hook.
jsx
Verify
Open In Editor
Edit
Copy code
import { useState } from 'react';
const useForm = (initialValues, validate) => {
const [values,
setValues] = useState(initialValues);
const [errors,
setErrors] = useState({});
const handleChange =
(e) => {
const { name, value
} = e.target;
setValues({ ...
values, [name]: value });
if (validate) {
const
validationErrors = validate({ ...values, [name]: value });
setErrors(validationErrors);
}
};
const handleSubmit =
(e, callback) => {
e.preventDefault();
if (validate) {
const
validationErrors = validate(values);
setErrors(validationErrors);
if
(Object.keys(validationErrors).length === 0) {
callback(values);
}
} else {
callback(values);
}
};
return { values,
errors, handleChange, handleSubmit };
};
export default useForm;
Set Up the Contact Form Component: Create a new React
component called ContactForm that uses the useForm hook.
jsx
Verify
Open In Editor
Edit
Copy code
import React from 'react';
import useForm from './useForm';
const validate = (values) => {
const errors = {};
if (!values.name) {
errors.name = 'Name
is required';
}
if (!values.email) {
errors.email =
'Email is required';
} else if (!/\S+@\S+\.\S+/.test(values.email))
{
errors.email =
'Email is invalid';
}
if (!values.message)
{
errors.message =
'Message is required';
} else if
(values.message.length < 10) {
errors.message =
'Message must be at least 10 characters';
}
return errors;
};
const ContactForm = () => {
const { values,
errors, handleChange, handleSubmit } = useForm(
{ name: '', email:
'', message: '' },
validate
);
const submitForm =
(formData) => {
console.log('Form
submitted:', formData);
};
return (
<form
onSubmit={(e) => handleSubmit(e, submitForm)}>
<div>
<label>Name:</label>
<input
type="text" name="name" value={values.name}
onChange={handleChange} />
{errors.name
&& <span style={{ color: 'red' }}>{errors.name}</span>}
</div>
<div>
<label>Email:</label>
<input
type="email" name="email" value={values.email}
onChange={handleChange} />
{errors.email
&& <span style={{ color: 'red' }}>{errors.email}</span>}
</div>
<div>
<label>Message:</label>
<textarea
name="message" value={values.message} onChange={handleChange} />
{errors.message
&& <span style={{ color: 'red' }}>{errors.message}</span>}
</div>
<button
type="submit">Submit</button>
</form>
);
};
export default ContactForm;
Explanation:
The useForm hook manages the form state and validation logic.
The validate function checks the input values and returns any
errors.
The ContactForm component uses the useForm hook to manage its
state and handle submissions.
The handleChange function updates the state and performs
validation on each input change.
The handleSubmit function prevents the default form
submission and calls the submitForm function if validation passes.
Assignment 5: Form with Asynchronous Validation
Task
Create a registration form that includes fields for username
and email. Implement asynchronous validation to check if the username is
already taken (simulate this with a timeout). Ensure that the email is
validated as well.
Step-by-Step Solution
Set Up the React Component: Create a new React component
called AsyncValidationForm.
jsx
Verify
Open In Editor
Edit
Copy code
import React, { useState } from 'react';
const AsyncValidationForm = () => {
const [formData,
setFormData] = useState({ username: '', email: '' });
const [errors,
setErrors] = useState({});
const [isSubmitting,
setIsSubmitting] = useState(false);
const validate =
async () => {
const newErrors =
{};
if
(!formData.username) {
newErrors.username = 'Username is required';
} else if (await
checkUsernameExists(formData.username)) {
newErrors.username = 'Username is already taken';
}
if
(!formData.email) {
newErrors.email =
'Email is required';
} else if
(!/\S+@\S+\.\S+/.test(formData.email)) {
newErrors.email =
'Email is invalid';
}
setErrors(newErrors);
return
Object.keys(newErrors).length === 0;
};
const
checkUsernameExists = (username) => {
return new Promise
((resolve) => {
setTimeout(()
=> {
// Simulate a
username check (e.g., from a database)
const takenUser
names = ['user1', 'admin', 'test'];
resolve(takenUser names.includes(username));
}, 1000);
});
};
const handleChange =
(e) => {
const { name, value
} = e.target;
setFormData({
...formData, [name]: value });
};
const handleSubmit =
async (e) => {
e.preventDefault();
setIsSubmitting(true);
if (await
validate()) {
console.log('Form
submitted:', formData);
}
setIsSubmitting(false);
};
return (
<form
onSubmit={handleSubmit}>
<div>
<label>Username:</label>
<input
type="text" name="username" value={formData.username}
onChange={handleChange} />
{errors.username && <span style={{ color: 'red'
}}>{errors.username}</span>}
</div>
<div>
<label>Email:</label>
<input
type="email" name="email" value={formData.email}
onChange={handleChange} />
{errors.email
&& <span style={{ color: 'red' }}>{errors.email}</span>}
</div>
<button
type="submit" disabled={isSubmitting}>Submit</button>
{isSubmitting && <p>Checking
username...</p>}
</form>
);
};
export default AsyncValidationForm;
Explanation:
The validate function checks if the username is taken by
calling the checkUsernameExists function, which simulates an asynchronous check
with a timeout.
The handleChange function updates the form data as the user
types.
The handleSubmit function prevents the default submission,
validates the form asynchronously, and logs the data if validation passes.
A loading message is displayed while the username is being
checked.
Conclusion
These assignments provide a comprehensive understanding of
form handling in React, covering validation, dynamic fields, the use of
libraries, custom hooks, and asynchronous validation. Completing these tasks
will enhance your skills in building robust forms for web applications. Make
sure to test your implementations thoroughly and explore additional features or
enhancements as you become more comfortable with the concepts. Happy coding!
You
WRITE 100 no of MCQs only FROM ABOVE CONCEPT with explanation
BLACKBOXAI
Here are 100 multiple-choice questions (MCQs) based on the
advanced form handling techniques in React, including validation, dynamic
fields, and the use of libraries like Formik and Yup. Each question is followed
by the correct answer and a brief explanation.
MCQs on React Forms Advanced
What is a controlled component in React?
A) A component that manages its own state.
B) A component whose state is controlled by React.
C) A component that does not manage any state.
D) A component that uses refs for state management.
Answer: B
Explanation: A controlled component is one where the form
data is handled by the component's state.
Which hook is commonly used to manage form state in
functional components?
A) useEffect
B) useReducer
C) useState
D) useContext
Answer: C
Explanation: The useState hook is used to manage state in
functional components, including form data.
What does the validate function typically return in a form
validation scenario?
A) A boolean value
B) An object containing error messages
C) A string message
D) An array of valid inputs
Answer: B
Explanation: The validate function usually returns an object
containing error messages for invalid fields.
Which library is commonly used for form validation in React?
A) Axios
B) Yup
C) Redux
D) React Router
Answer: B
Explanation: Yup is a popular library used for schema
validation in forms.
What is the purpose of the ErrorMessage component in Formik?
A) To submit the form
B) To display validation error messages
C) To create input fields
D) To manage form state
Answer: B
Explanation: The ErrorMessage component is used to display
validation error messages for specific fields.
In a dynamic form, what does the term "dynamic"
refer to?
A) The form is styled dynamically.
B) The form fields can be added or removed based on user
input.
C) The form data is fetched dynamically from an API.
D) The form is rendered on the server.
Answer: B
Explanation: Dynamic forms allow users to add or remove
fields based on their input.
What is the purpose of the handleChange function in a form?
A) To submit the form
B) To update the state when the input value changes
C) To validate the form
D) To reset the form
Answer: B
Explanation: The handleChange function updates the
component's state when the user types in an input field.
Which of the following is NOT a benefit of using Formik?
A) Simplifies form state management
B) Provides built-in validation
C) Automatically handles form submission
D) Requires extensive boilerplate code
Answer: D
Explanation: Formik reduces boilerplate code, making form
management easier.
What does the initialValues prop in Formik represent?
A) The default values for the form fields
B) The values after form submission
C) The values that are fetched from an API
D) The values that are validated
Answer: A
Explanation: The initialValues prop defines the default
values for the form fields.
What is the purpose of the onSubmit prop in Formik?
A) To define the initial values
B) To handle form submission
C) To validate the form
D) To reset the form
Answer: B
Explanation: The onSubmit prop is a function that is called
when the form is submitted.
Which of the following is a valid way to create a dynamic
field in a React form?
A) Using a static array
B) Using a loop to render fields based on an array in state
C) Hardcoding the fields
D) Using a single input field
Answer: B
Explanation: Dynamic fields can be created by rendering them
based on an array stored in the component's state.
What does the setErrors function do in form validation?
A) It resets the form fields.
B) It updates the error messages in the form state.
C) It submits the form.
D) It initializes the form values.
Answer: B
Explanation: The setErrors function is used to update the
error messages in the form state based on validation results.
What is the purpose of the validate function in a custom form
hook?
A) To handle form submission
B) To manage form state
C) To check the validity of form inputs and return errors
D) To render the form
Answer: C
Explanation: The validate function checks the input values
and returns any errors found during validation.
Which of the following is a common way to handle asynchronous
validation in a form?
A) Using a synchronous function
B) Using a Promise to simulate an API call
C) Using local storage
D) Using a static array
Answer: B
Explanation: Asynchronous validation can be handled by
returning a Promise that simulates an API call to check for existing values.
What does the useForm custom hook typically return?
A) Only the form values
B) An object containing values, errors, and handlers
C) Only the error messages
D) A string indicating the form status
Answer: B
Explanation: The useForm hook returns an object that includes
the current form values, any validation errors, and functions to handle changes
and submissions.
In Formik, what does the Field component do?
A) It handles form submission.
B) It creates an input field that is connected to Formik's
state.
C) It validates the form.
D) It displays error messages.
Answer: B
Explanation: The Field component is used to create input
fields that are automatically connected to Formik's state management.
What is the purpose of the setSubmitting function in Formik?
A) To reset the form
B) To indicate whether the form is currently being submitted
C) To validate the form
D) To update the form values
Answer: B
Explanation: The setSubmitting function is used to indicate
whether the form is in the process of being submitted, which can be useful for
disabling buttons or showing loading indicators.
Which of the following is a valid way to implement
client-side validation in a React form?
A) Using only HTML attributes
B) Using a validation library like Yup
C) Ignoring validation altogether
D) Using server-side validation only
Answer: B
Explanation: Client-side validation can be effectively
implemented using a validation library like Yup to define validation schemas.
What is the main advantage of using a library like Formik for
form handling?
A) It requires more code to implement.
B) It simplifies form state management and validation.
C) It does not support validation.
D) It is only for class components.
Answer: B
Explanation: Formik simplifies the process of managing form
state and validation, making it easier to build complex forms.
What is the purpose of the onChange event in a form input?
A) To submit the form
B) To reset the form
C) To trigger a function when the input value changes
D) To validate the form
Answer: C
Explanation: The onChange event is used to trigger a function
whenever the value of the input changes, allowing for real-time updates to the
form state.
Which of the following is a common pattern for handling form
submissions in React?
A) Using a single function for all forms
B) Creating a separate function for each form
C) Using inline event handlers only
D) Ignoring form submissions
Answer: B
Explanation: It is common to create a separate function for
handling submissions for each form to manage their specific logic.
What does the required attribute do in an HTML input element?
A) It makes the input field read-only.
B) It specifies that the input must be filled out before
submitting the form.
C) It sets a default value for the input.
D) It disables the input field.
Answer: B
Explanation : The required attribute indicates that the input
field must be filled out before the form can be submitted, enforcing
client-side validation.
What is the purpose of the useEffect hook in a form
component?
A) To manage form state
B) To perform side effects, such as fetching data or updating
the DOM
C) To handle form submission
D) To validate form inputs
Answer: B
Explanation: The useEffect hook is used to perform side
effects in functional components, such as fetching data or updating the DOM based
on state changes.
Which of the following is a valid way to reset a form in
React?
A) Setting the state to null
B) Using the reset method on the form element
C) Re-initializing the state with default values
D) Both B and C
Answer: D
Explanation: Forms can be reset by either using the reset
method on the form element or by re-initializing the state with default values.
What does the setFieldValue function do in Formik?
A) It sets the initial values of the form.
B) It updates the value of a specific field in the form
state.
C) It validates the form.
D) It submits the form.
Answer: B
Explanation: The setFieldValue function is used to
programmatically set the value of a specific field in the Formik form state.
What is the purpose of the validateOnChange prop in Formik?
A) To disable validation
B) To enable validation on input change
C) To validate the form only on submission
D) To reset the form
Answer: B
Explanation: The validateOnChange prop determines whether
validation should occur on input change events.
Which of the following is a common way to handle form errors
in React?
A) Ignoring errors
B) Displaying error messages below the input fields
C) Logging errors to the console only
D) Using alerts for every error
Answer: B
Explanation: A common practice is to display error messages
below the input fields to inform users of validation issues.
What does the touched property in Formik indicate?
A) Whether the form has been submitted
B) Whether the user has interacted with a field
C) The current values of the form fields
D) The validation status of the form
Answer: B
Explanation: The touched property indicates whether a user
has interacted with a specific field, which can be used to determine when to
show error messages.
What is the purpose of the onBlur event in a form input?
A) To submit the form
B) To trigger validation when the input loses focus
C) To reset the form
D) To update the input value
Answer: B
Explanation: The onBlur event is triggered when the input
loses focus, and it is often used to perform validation.
Which of the following is a valid way to create a multi-step
form in React?
A) Using a single component for all steps
B) Using separate components for each step and managing state
to track the current step
C) Hardcoding all steps in one component
D) Ignoring the concept of steps
Answer: B
Explanation: Multi-step forms can be created by using
separate components for each step and managing state to track the current step.
What is the purpose of the validateOnBlur prop in Formik?
A) To disable validation
B) To enable validation when the input loses focus
C) To validate the form only on submission
D) To reset the form
Answer: B
Explanation: The validateOnBlur prop determines whether
validation should occur when an input field loses focus.
Which of the following is a common way to handle form
submission errors?
A) Ignoring errors
B) Displaying a generic error message
C) Logging errors to the console only
D) Displaying specific error messages based on the error type
Answer: D
Explanation: It is common to display specific error messages
based on the error type to provide users with clear feedback on what went
wrong.
What does the setFieldTouched function do in Formik?
A) It sets the value of a specific field.
B) It marks a field as "touched" to trigger
validation.
C) It resets the form.
D) It submits the form.
Answer: B
Explanation: The setFieldTouched function is used to mark a
specific field as "touched," which can trigger validation and error
messages.
Which of the following is a valid way to implement
conditional rendering in a form?
A) Using a static boolean value
B) Using state to determine which fields to render
C) Hardcoding all fields
D) Ignoring conditional rendering
Answer: B
Explanation: Conditional rendering can be implemented by
using state to determine which fields to render based on user input or other
conditions.
What is the purpose of the validateOnMount prop in Formik?
A) To disable validation
B) To enable validation when the form mounts
C) To validate the form only on submission
D) To reset the form
Answer: B
Explanation: The validateOnMount prop determines whether
validation should occur when the form mounts.
Which of the following is a common way to handle form state
in a class component?
A) Using hooks
B) Using this.state and this.setState
C) Ignoring state management
D) Using global state only
Answer: B
Explanation: In class components, form state is typically
managed using this.state and this.setState.
What is the purpose of the initialTouched prop in Formik?
A) To set the initial values of the form
B) To define which fields are initially marked as touched
C) To validate the form
D) To reset the form
Answer: B
Explanation: The initialTouched prop allows you to define
which fields should be marked as touched when the form first renders.
Which of the following is a valid way to implement a reset
button in a form?
A) Using a button with type "reset"
B) Using a custom function to reset the state
C) Both A and B
D) Ignoring reset functionality
Answer: C
Explanation: A reset button can be implemented using a button
with type "reset" or by using a custom function to reset the form
state.
What does the setSubmitting function do in Formik?
A) It sets the initial values of the form.
B) It indicates whether the form is currently being
submitted.
C) It validates the form.
D) It updates the form values.
Answer: B
Explanation: The setSubmitting function is used to indicate
whether the form is in the process of being submitted, which can be useful for
disabling buttons or showing loading indicators.
Which of the following is a common way to handle form
validation in a custom hook?
A) Using a validation library like Yup
B) Ignoring validation
C) Using only HTML attributes
D) Using server-side validation only
Answer: A
Explanation: A common practice is to use a validation library
like Yup to define validation schemas in custom hooks.
What is the purpose of the onSubmit function in a custom form
hook?
A) To manage form state
B) To handle form submission logic
C) To validate the form
D) To reset the form
Answer: B
Explanation: The onSubmit function is responsible for
handling the logic that occurs when the form is submitted.
Which of the following is a valid way to implement a
multi-step form in React?
A) Using a single component for all steps
B) Using separate components for each step and managing state
to track the current step
C) Hardcoding all steps in one component
D) Ignoring the concept of steps
Answer: B
Explanation: Multi-step forms can be created by using separate
components for each step and managing state to track the current step.
What does the setFieldError function do in Formik?
A) It sets the value of a specific field.
B) It updates the error message for a specific field.
C) It resets the form.
D) It submits the form.
Answer: B
Explanation: The setFieldError function is used to
programmatically set the error message for a specific field in the Formik form
state.
What is the purpose of the validate function in a custom form
hook?
A) To handle form submission
B) To manage form state
C) To check the validity of form inputs and return errors
D) To render the form
Answer: C
Explanation: The validate function checks the input values
and returns any errors found during validation.
Which of the following is a common way to handle form errors
in React?
A) Ignoring errors
B) Displaying error messages below the input fields
C) Logging errors to the console only
D) Using alerts for every error
Answer: B
Explanation: A common practice is to display error messages
below the input fields to inform users of validation issues.
What does the touched property in Formik indicate?
A) Whether the form has been submitted
B) Whether the user has interacted with a field
C) The current values of the form fields
D) The validation status of the form
Answer: B
Explanation: The touched property indicates whether a user
has interacted with a specific field, which can be used to determine when to
show error messages.
What is the purpose of the onBlur event in a form input?
A) To submit the form
B) To trigger validation when the input loses focus
C) To reset the form
D) To update the input value
Answer: B
Explanation: The onBlur event is triggered when the input
loses focus, and it is often used to perform validation.
Which of the following is a valid way to create a multi-step
form in React?
A) Using a single component for all steps
B) Using separate components for each step and managing state
to track the current step
C) Hardcoding all steps in one component
D) Ignoring the concept of steps
Answer: B
Explanation: Multi-step forms can be created by using
separate components for each step and managing state to track the current step.
What is the purpose of the validateOnMount prop in Formik?
A) To disable validation
B) To enable validation when the form mounts
C) To validate the form only on submission
D) To reset the form
Answer: B
Explanation: The validateOnMount prop determines whether
validation should occur when the form mounts.
Which of the following is a valid way to implement a reset
button in a form?
A) Using a button with type "reset"
B) Using a custom function to reset the state
C) Both A and B
D) Ignoring reset functionality
Answer: C
Explanation: A reset button can be implemented using a button
with type "reset" or by using a custom function to reset the form
state.
What does the setSubmitting function do in Formik?
A) It sets the initial values of the form.
B) It indicates whether the form is currently being
submitted.
C) It validates the form.
D) It updates the form values.
Answer: B
Explanation: The setSubmitting function is used to indicate
whether the form is in the process of being submitted, which can be useful for
disabling buttons or showing loading indicators.
Which of the following is a common way to handle form
validation in a custom hook?
A) Using a validation library like Yup
B) Ignoring validation
C) Using only HTML attributes
D) Using server-side validation only
Answer: A
Explanation: A common practice is to use a validation library
like Yup to define validation schemas in custom hooks.
What is the purpose of the onSubmit function in a custom form
hook?
A) To manage form state
B) To handle form I'll continue with the rest of the MCQs.
What does the setFieldTouched function do in Formik?
A) It sets the value of a specific field.
B) It marks a field as "touched" to trigger
validation.
C) It resets the form.
D) It submits the form.
Answer: B
Explanation: The setFieldTouched function is used to mark a
specific field as "touched," which can trigger validation and error
messages.
Which of the following is a valid way to implement
conditional rendering in a form?
A) Using a static boolean value
B) Using state to determine which fields to render
C) Hardcoding all fields
D) Ignoring conditional rendering
Answer: B
Explanation: Conditional rendering can be implemented by
using state to determine which fields to render based on user input or other
conditions.
What is the purpose of the validate function in a custom form
hook?
A) To handle form submission
B) To manage form state
C) To check the validity of form inputs and return errors
D) To render the form
Answer: C
Explanation: The validate function checks the input values
and returns any errors found during validation.
Which of the following is a common way to handle form errors
in React?
A) Ignoring errors
B) Displaying error messages below the input fields
C) Logging errors to the console only
D) Using alerts for every error
Answer: B
Explanation: A common practice is to display error messages
below the input fields to inform users of validation issues.
What does the touched property in Formik indicate?
A) Whether the form has been submitted
B) Whether the user has interacted with a field
C) The current values of the form fields
D) The validation status of the form
Answer: B
Explanation: The touched property indicates whether a user
has interacted with a specific field, which can be used to determine when to
show error messages.
What is the purpose of the onBlur event in a form input?
A) To submit the form
B) To trigger validation when the input loses focus
C) To reset the form
D) To update the input value
Answer: B
Explanation: The onBlur event is triggered when the input
loses focus, and it is often used to perform validation.
Which of the following is a valid way to create a multi-step
form in React?
A) Using a single component for all steps
B) Using separate components for each step and managing state
to track the current step
C) Hardcoding all steps in one component
D) Ignoring the concept of steps
Answer: B
Explanation: Multi-step forms can be created by using
separate components for each step and managing state to track the current step.
What is the purpose of the validateOnMount prop in Formik?
A) To disable validation
B) To enable validation when the form mounts
C) To validate the form only on submission
D) To reset the form
Answer: B
Explanation: The validateOnMount prop determines whether
validation should occur when the form mounts.
Which of the following is a valid way to implement a reset
button in a form?
A) Using a button with type "reset"
B) Using a custom function to reset the state
C) Both A and B
D) Ignoring reset functionality
Answer: C
Explanation: A reset button can be implemented using a button
with type "reset" or by using a custom function to reset the form
state.
What does the setSubmitting function do in Formik?
A) It sets the initial values of the form.
B) It indicates whether the form is currently being
submitted.
C) It validates the form.
D) It updates the form values.
Answer: B
Explanation: The setSubmitting function is used to indicate
whether the form is in the process of being submitted, which can be useful for
disabling buttons or showing loading indicators.
Which of the following is a common way to handle form
validation in a custom hook?
A) Using a validation library like Yup
B) Ignoring validation
C) Using only HTML attributes
D) Using server-side validation only
Answer: A
Explanation: A common practice is to use a validation library
like Yup to define validation schemas in custom hooks.
What is the purpose of the onSubmit function in a custom form
hook?
A) To manage form state
B) To handle form submission logic
C) To validate the form
D) To reset the form
Answer: B
Explanation: The onSubmit function is responsible for
handling the logic that occurs when the form is submitted.
Which of the following is a valid way to implement a
multi-step form in React?
A) Using a single component for all steps
B) Using separate components for each step and managing state
to track the current step
C) Hardcoding all steps in one component
D) Ignoring the concept of steps
Answer: B
Explanation: Multi-step forms can be created by using
separate components for each step and managing state to track the current step.
What does the setFieldError function do in Formik?
A) It sets the value of a specific field.
B) It updates the error message for a specific field.
C) It resets the form.
D) It submits the form.
Answer: B
Explanation: The setFieldError function is used to
programmatically set the error message for a specific field in the Formik form
state.
What is the purpose of the validate function in a custom form
hook?
A) To handle form submission
B) To manage form state
C) To check the validity of form inputs and return errors
D) To render the form
Answer: C
Explanation: The validate function checks the input values
and returns any errors found during validation.
Which of the following is a common way to handle form errors
in React?
A) Ignoring errors
B) Displaying error messages below the input fields
C) Logging errors to the console only
D) Using alerts for every error
Answer: B
Explanation: A common practice is to display error messages
below the input fields to inform users of validation issues.
What does the touched property in Formik indicate?
A) Whether the form has been submitted
B) Whether the user has interacted with a field
C) The current values of the form fields
D) The validation status of the form
Answer: B
Explanation: The touched property indicates whether a user
has interacted with a specific field, which can be used to determine when to
show error messages.
What is the purpose of the onBlur event in a form input?
A) To submit the form
B) To trigger validation when the input loses focus
C) To reset the form
D) To update the input value
Answer: B
Explanation: The onBlur event is triggered when the input
loses focus, and it is often used to perform validation.
Which of the following is a valid way to create a multi-step
form in React?
A) Using a single component for all steps
B) Using separate components for each step and managing state
to track the current step
C) Hardcoding all steps in one component
D) Ignoring the concept of steps
Answer: B
Explanation: Multi-step forms can be created by using
separate components for each step and managing state to track the current step.
What is the purpose of the validateOnMount prop in Formik?
A) To disable validation
B) To enable validation when the form mounts
C) To validate the form only on submission
D) To reset the form
Answer: B
Explanation: The validateOnMount prop determines whether
validation should occur when the form mounts.
Which of the following is a valid way to implement a reset
button in a form?
A) Using a button with type "reset"
B) Using a custom function to reset the state
C) Both A and B
D) Ignoring reset functionality
Answer: C
Explanation: A reset button can be implemented using a button
with type "reset" or by using a custom function to reset the form
state.
What does the setSubmitting function do in Formik?
A) It sets the initial values of the form.
B) It indicates whether the form is currently being
submitted.
C) It validates the form.
D) It updates the form values.
Answer: B
Explanation: The setSubmitting function is used to indicate
whether the form is in the process of being submitted, which can be useful for
disabling buttons or showing loading indicators.
Which of the following is a common way to handle form
validation in a custom hook?
A) Using a validation library like Yup
B) Ignoring validation
C) Using only HTML attributes
D) Using server-side validation only
Answer: A
Explanation: A common practice is to use a validation library
like Yup to define validation schemas in custom hooks.
What is the purpose of the onSubmit function in a custom form
hook?
A) To manage form state
B) To handle form submission logic
C) To validate the form
D) To reset the form
Answer: B
Explanation: The onSubmit function is responsible for
handling the logic that occurs when the form is submitted.
Which of the following is a valid way to implement a
multi-step form in React?
A) Using a single component for all steps
B) Using separate components for each step and managing state
to track the current step
C) Hardcoding all steps in one component
D) Ignoring the concept of steps
Answer: B
Explanation: Multi-step forms can be created by using
separate components for each step and managing state to track the current step.
What does the setFieldError function do in Formik?
A) It sets the value of a specific field.
B) It updates the error message for a specific field.
C) It resets the form.
D) It submits the form.
Answer: B
Explanation: The setFieldError function is used to
programmatically set the error message for a specific field in the Formik form
state.
What is the purpose of the validate function in a custom form
hook?
A) To handle form submission
B) To manage form state
C) To check the validity of form inputs and return errors
D) To render the form
Answer: C
Explanation: The validate function checks the input values
and returns any errors found during validation.
Which of the following is a common way to handle form errors
in React?
A) Ignoring errors
B) Displaying error messages below the input fields
C) Logging errors to the console only
D) Using alerts for every error
Answer: B
Explanation: A common practice is to display error messages
below the input fields to inform users of validation issues.
What does the touched property in Formik indicate?
A) Whether the form has been submitted
B) Whether the user has interacted with a field
C) The current values of the form fields
D) The validation status of the form
Answer: B
Explanation: The touched property indicates whether a user
has interacted with a specific field, which can be used to determine when to
show error messages.
What is the purpose of the onBlur event in a form input?
A) To submit the form
B) To trigger validation when the input loses focus
C) To reset the form
D) To update the input value
Answer: B
Explanation: The onBlur event is triggered when the input
loses focus, and it is often used to perform validation.
Which of the following is a valid way to create a multi-step
form in React?
A) Using a single component for all steps
B) Using separate components for each step and managing state
to track the current step
C) Hardcoding all steps in one component
D) Ignoring the concept of steps
Answer: B
Explanation: Multi-step forms can be created by using
separate components for each step and managing state to track the current step.
What is the purpose of the validateOnMount prop in Formik?
A) To disable validation
B) To enable validation when the form mounts
C) To validate the form only on submission
D) To reset the form
Answer: B
Explanation: The validateOnMount prop determines whether
validation should occur when the form mounts.
Which of the following is a valid way to implement a reset
button in a form?
A) Using a button with type "reset"
B) Using a custom function to reset the state
C) Both A and B
D) Ignoring reset functionality
Answer: C
Explanation: A reset button can be implemented using a button
with type "reset" or by using a custom function to reset the form
state.
What does the setSubmitting function do in Formik?
A) It sets the initial values of the form.
B) It indicates whether the form is currently being
submitted.
C) It validates the form.
D) It updates the form values.
Answer: B
Explanation: The setSubmitting function is used to indicate
whether the form is in the process of being submitted, which can be useful for
disabling buttons or showing loading indicators.
Which of the following is a common way to handle form
validation in a custom hook?
A) Using a validation library like Yup
B) Ignoring validation
C) Using only HTML attributes
D) Using server-side validation only
Answer: A
Explanation: A common practice is to use a validation library
like Yup to define validation schemas in custom hooks.
What is the purpose of the onSubmit function in a custom form
hook?
A) To manage form state
B) To handle form submission logic
C) To validate the form
D) To reset the form
Answer: B
Explanation: The onSubmit function is responsible for
handling the logic that occurs when the form is submitted.
Which of the following is a valid way to implement a
multi-step form in React?
A) Using a single component for all steps
B) Using separate components for each step and managing state
to track the current step
C) Hardcoding all steps in one component
D) Ignoring the concept of steps
Answer: B
Explanation: Multi-step forms can be created by using
separate components for each step and managing state to track the current step.
What does the setFieldError function do in Formik?
A) It sets the value of a specific field.
B) It updates the error message for a specific field.
C) It resets the form.
D) It submits the form.
Answer: B
Explanation: The setFieldError function is used to
programmatically set the error message for a specific field in the Formik form
state.
What is the purpose of the validate function in a custom form
hook?
A) To handle form submission
B) To manage form state
C) To check the validity of form inputs and return errors
D) To render the form
Answer: C
Explanation: The validate function checks the input values
and returns any errors found during validation.
Which of the following is a common way to handle form errors
in React?
A) Ignoring errors
B) Displaying error messages below the input fields
C) Logging errors to the console only
D) Using alerts for every error
Answer: B
Explanation: A common practice is to display error messages
below the input fields to inform users of validation issues.
What does the touched property in Formik indicate?
A) Whether the form has been submitted
B) Whether the user has interacted with a field
C) The current values of the form fields
D) The validation status of the form
Answer: B
Explanation: The touched property indicates whether a user
has interacted with a specific field, which can be used to determine when to
show error messages.
What is the purpose of the onBlur event in a form input?
A) To submit the form
B) To trigger validation when the input loses focus
C) To reset the form
D) To update the input value
Answer: B
Explanation: The onBlur event is triggered when the input
loses focus, and it is often used to perform validation.
Which of the following is a valid way to create a multi-step
form in React?
A) Using a single component for all steps
B) Using separate components for each step and managing state
to track the current step
C) Hardcoding all steps in one component
D) Ignoring the concept of steps
Answer: B
Explanation: Multi-step forms can be created by using
separate components for each step and managing state to track the current step.
What is the purpose of the validateOnMount prop in Formik?
A) To disable validation
B) To enable validation when the form mounts
C) To validate the form only on submission
D) To reset the form
Answer: B
Explanation: The validateOnMount prop determines whether
validation should occur when the form mounts.
Which of the following is a valid way to implement a reset
button in a form?
A) Using a button with type "reset"
B) Using a custom function to reset the state
C) Both A and B
D) Ignoring reset functionality
Answer: C
Explanation: A reset button can be implemented using a button
with type "reset" or by using a custom function to reset the form
state.
What does the setSubmitting function do in Formik?
A) It sets the initial values of the form.
B) It indicates whether the form is currently being
submitted.
C) It validates the form.
D) It updates the form values.
Answer: B
Explanation: The setSubmitting function is used to indicate
whether the form is in the process of being submitted, which can be useful for
disabling buttons or showing loading indicators.
Which of the following is a common way to handle form
validation in a custom hook?
A) Using a validation library like Yup
B) Ignoring validation
C) Using only HTML attributes
D) Using server-side validation only
Answer: A
Explanation: A common practice is to use a validation library
like Yup to define validation schemas in custom hooks.
