Table of Contents
Example of input elements
Login!
Home Web Front-end CSS Tutorial Demonstrating Reusable React Components in a Form

Demonstrating Reusable React Components in a Form

Apr 16, 2025 am 10:36 AM

Demonstrating Reusable React Components in a Form

The cornerstone of React applications are components. It is almost impossible to build a React application without using components. The widespread use of components has even led to some third-party packages providing components that can be used for integration capabilities.

These third-party components are usually reusable . The difference between them and components that may already be available in your application is specificity .

I mean: Suppose you run a company that sells Polo shirts, you can do this:

  1. Produce Polo shirts that have been printed with patterns, or
  2. Let the buyers choose the pattern they want.

Some basic elements will remain consistent, for example, all Polo shirts should be short-sleeved. But users can choose different styles of shirts, such as colors and sizes. In this case, a short-sleeved Polo shirt is a good React component: it is the same item with different variations.

Now let's say you are developing a login form. Like Polo shirts, forms have consistent characteristics, but we are not focusing on size and color changes, but input fields, submit buttons, and maybe even forget password links. This can componentize and implement various changes in inputs, buttons, links, etc.

Example of input elements

Let's look at it from the perspective of creating input fields for the form. Typical text inputs in the React component look like this:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

class Form extends React.Component {

 constructor(props) {

   super(props);

   this.state = {

     username: ''

   };

 }

 

 handleChange = (event) => {

   this.setState({ username: event.target.value });

 };

 

 render() {

   Return (

Copy after login
); } }

In order for this input element to be reusable elsewhere and in the project, we have to extract it into its own component. Let's name it FormInput.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

import React from 'react';

import PropTypes from 'prop-types';

 

const FormInput = ({

  name,

  type,

  placeholder,

  onChange,

  className,

  value,

  error,

  children,

  label,

  ...props

}) => {

 

  Return (

    <div>

      <label htmlfor="{name}">{label}</label>

      <input type="{type}" name="{name}" placeholder="{placeholder}" onchange="{onChange}" classname="{className}" value="{value}">

      {error &&<p> {error}</p> }

    </div>

  );

};

 

FormInput.defaultProps = {

  type: "text",

  className: ""

};

 

FormInput.propTypes = {

  name: PropTypes.string.isRequired,

  type: PropTypes.oneOf(['text', 'number', 'password']),

  placeholder: PropTypes.string.isRequired,

  className: PropTypes.string,

  value: PropTypes.any,

  onChange: PropTypes.func.isRequired,

  label: PropTypes.string.isRequired // Added required label prop

};

 

export default FormInput;

Copy after login

This component accepts certain props, such as the properties we need to create input using valid tags, including placeholders, values, and names. We set the input element in the render function and set the property value to props passed to the component. We even bind the input to the tag to make sure they are always together. You can see that we are not making assumptions by predefined anything. Our goal is to make sure that the component can be used in as many scenarios as possible.

This makes up a good component because it enforces good markup (what Brad Frost calls it "dumb React"), which suggests that not every component must be some kind of highly complex functionality. That being said, if we are talking about something very basic, like static headers, then using React components might be a bit overkill. The possible criterion for making something as a reusable component is when you need to use the same functionality in other parts of your application. If the component is used only once, a "reusable" component is usually not required.

We can use our input component in another component LoginPage.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

import React, { Component } from 'react';

import FormInput from './FormInput'; // Import FormInput component

 

class LoginPage extends Component {

  state = {

    user: {

      username: "",

      password: ""

    },

    errors: {},

    submitted: false

  };

 

  handleChange = event => {

    const { user } = this.state;

    user[event.target.name] = event.target.value;

    this.setState({ user });

  };

 

  onSubmit = (event) => {

    event.preventDefault(); // Prevent default form submission

    const { user } = this.state;

    let errors = {};

 

    if (!user.username) {

      errors.username = "Enter your username!";

    }

 

    if (user.password.length

        {submitted ? (

          <p>Welcome onboard, {user.username}!</p>

        ) : (

          <div>

            <h3 id="Login">Login!</h3>

            <forminput name="username" label="Username" placeholder="Enter your username" value="{user.username}" onchange="{this.handleChange}" error="{errors.username}"></forminput>

            <forminput name="password" type="password" label="Password" placeholder="Enter your password" value="{user.password}" onchange="{this.handleChange}" error="{errors.password}"></forminput>

            <button type="submit">Login</button>

          </div>

        )}

       

    );

  }

}

 

export default LoginPage;

Copy after login

Have you seen how LoginPage uses FormInput twice? We use it as text input for both username and password. If we want to change the functionality of the input, we can make these changes in the FormInput component file we created, and these changes will be applied to each instance of using the input component. This is the basic advantage of having reusable components: you don't have to repeat yourself .

Even the error is displayed from the FormInput component.

The onSubmit function first verifies the user object we get from the form to make sure it conforms to the structure in which the username has a value. Note that we can even extend the functionality of the input, as we did, checking if the password contains at least eight characters.

If you look at the code, you will see that there is a Button component in it. This is different from an HTML element, but rather a different component that takes props that define the type of button we want (submit, reset, button), its class name, what to do when clicked, and the label. We can integrate many other button properties to enforce any standard you want.

1

2

3

4

5

6

7

const Button = ({ type, className, onClick, label, ...props }) => (

  <button type="{type}" classname="{className}" onclick="{onClick}">

    {label}

  </button>

);

 

export default Button;

Copy after login

This is the final login form after putting all the components together.

Want to try it yourself? Try using reusable<input> element. If this is too difficult, you can<input> The element starts, then maybe a checkbox, and then jumps to<select></select> . The key idea is to make it universal. I would love to see your achievements, so please link your work in the comment section!

The above is the detailed content of Demonstrating Reusable React Components in a Form. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Roblox: Bubble Gum Simulator Infinity - How To Get And Use Royal Keys
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
Nordhold: Fusion System, Explained
4 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
Mandragora: Whispers Of The Witch Tree - How To Unlock The Grappling Hook
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

Hot Topics

Java Tutorial
1670
14
PHP Tutorial
1273
29
C# Tutorial
1256
24
A Comparison of Static Form Providers A Comparison of Static Form Providers Apr 16, 2025 am 11:20 AM

Let’s attempt to coin a term here: "Static Form Provider." You bring your HTML

A Proof of Concept for Making Sass Faster A Proof of Concept for Making Sass Faster Apr 16, 2025 am 10:38 AM

At the start of a new project, Sass compilation happens in the blink of an eye. This feels great, especially when it’s paired with Browsersync, which reloads

Weekly Platform News: HTML Loading Attribute, the Main ARIA Specifications, and Moving from iFrame to Shadow DOM Weekly Platform News: HTML Loading Attribute, the Main ARIA Specifications, and Moving from iFrame to Shadow DOM Apr 17, 2025 am 10:55 AM

In this week&#039;s roundup of platform news, Chrome introduces a new attribute for loading, accessibility specifications for web developers, and the BBC moves

Some Hands-On with the HTML Dialog Element Some Hands-On with the HTML Dialog Element Apr 16, 2025 am 11:33 AM

This is me looking at the HTML element for the first time. I&#039;ve been aware of it for a while, but haven&#039;t taken it for a spin yet. It has some pretty cool and

Paperform Paperform Apr 16, 2025 am 11:24 AM

Buy or build is a classic debate in technology. Building things yourself might feel less expensive because there is no line item on your credit card bill, but

Where should 'Subscribe to Podcast' link to? Where should 'Subscribe to Podcast' link to? Apr 16, 2025 pm 12:04 PM

For a while, iTunes was the big dog in podcasting, so if you linked "Subscribe to Podcast" to like:

Weekly Platform News: Text Spacing Bookmarklet, Top-Level Await, New AMP Loading Indicator Weekly Platform News: Text Spacing Bookmarklet, Top-Level Await, New AMP Loading Indicator Apr 17, 2025 am 11:26 AM

In this week&#039;s roundup, a handy bookmarklet for inspecting typography, using await to tinker with how JavaScript modules import one another, plus Facebook&#039;s

Options for Hosting Your Own Non-JavaScript-Based Analytics Options for Hosting Your Own Non-JavaScript-Based Analytics Apr 15, 2025 am 11:09 AM

There are loads of analytics platforms to help you track visitor and usage data on your sites. Perhaps most notably Google Analytics, which is widely used

See all articles