DEV Community

Cover image for A Comprehensive Guide to work with Components in React 💻
Le Do Nghiem
Le Do Nghiem

Posted on

A Comprehensive Guide to work with Components in React 💻

React is a powerful JavaScript library for building user interfaces, and at the heart of every React application is the concept of components. Components allow you to break down your UI into small, reusable pieces, making your application easier to manage, scale, and maintain. In this guide, I will walk you through the basics of working with components in React, covering both functional and class components, props, and state management.

What Are Components in React?

A component is a self-contained, reusable block of code that renders a part of the user interface (UI). Components can be functional or class-based. They are the building blocks of a React application.

  • Functional Components: These are simpler and are written as JavaScript functions. They receive props and return JSX (React’s syntax for defining UI).
  • Class Components: These are more complex and were traditionally used for components that needed state and lifecycle methods. However, with the advent of React hooks, functional components are now more commonly used.

Step 1: Creating a Simple Functional Component

Let’s start by creating a basic functional component.
Example: Hello World Component

import React from 'react';

const HelloWorld = () => {
  return <h1>Hello, World!</h1>;
};

export default HelloWorld;

Enter fullscreen mode Exit fullscreen mode

In this example:

  • HelloWorld is a functional component.
  • It returns a simple JSX element, which renders the text "Hello, World!".

Using the Component in App.js
Once the component is created, you can use it in the main application component (typically App.js).

import React from 'react';
import HelloWorld from './HelloWorld';  // Importing the HelloWorld component

const App = () => {
  return (
    <div>
      <HelloWorld />
    </div>
  );
};

export default App;
Enter fullscreen mode Exit fullscreen mode

Here:

  • We import the HelloWorld component and include it inside the App component’s JSX.
  • React components can be used as custom HTML tags (e.g., <HelloWorld />).

Step 2: Passing Data to Components with Props

Props (short for "properties") are how data is passed to components in React. They are immutable (cannot be changed by the component receiving them) and are used to customize components.

Example: Component with Props
Let’s update the HelloWorld component to accept a name prop and display a personalized greeting.

import React from 'react';

const HelloWorld = ({ name }) => {
  return <h1>Hello, {name}!</h1>;
};

export default HelloWorld;

Enter fullscreen mode Exit fullscreen mode

Here:

  • We’ve added a name prop to the component and used it in the JSX to display a personalized greeting.

Using the Component with Props
Now, in the App component, we can pass a value to the name prop:

import React from 'react';
import HelloWorld from './HelloWorld';

const App = () => {
  return (
    <div>
      <HelloWorld name="Alice" />
      <HelloWorld name="Bob" />
    </div>
  );
};

export default App;
Enter fullscreen mode Exit fullscreen mode

Here:

  • We pass "Alice" and "Bob" as the name prop to the HelloWorld component, and it renders personalized greetings accordingly.

Step 3: Managing State in React Components

In React, state refers to data that can change over time and affect the component’s behavior and rendering. In functional components, we use React's useState hook to manage state.

Example: Counter Component with State
Let’s create a simple counter component that keeps track of a count and allows the user to increase or decrease it.

import React, { useState } from 'react';

const Counter = () => {
  const [count, setCount] = useState(0); // Initial state is set to 0

  const increment = () => setCount(count + 1); // Increment the count
  const decrement = () => setCount(count - 1); // Decrement the count

  return (
    <div>
      <h1>Count: {count}</h1>
      <button onClick={increment}>Increment</button>
      <button onClick={decrement}>Decrement</button>
    </div>
  );
};

export default Counter;
Enter fullscreen mode Exit fullscreen mode

In this example:

  • We use the useState hook to create a state variable (count) and a function (setCount) to update it.
  • The increment and decrement functions modify the count state when the buttons are clicked.

Using the Counter Component
Now, we can use the Counter component in App.js:

import React from 'react';
import Counter from './Counter';

const App = () => {
  return (
    <div>
      <Counter />
    </div>
  );
};

export default App;
Enter fullscreen mode Exit fullscreen mode

This will render the counter, and clicking the buttons will update the count value.

Step 4: Class Components (Optional)

Although functional components with hooks are now the preferred way to build components in React, you may still encounter class components in older codebases.
Here’s how to define a class component in React:

Example: Class Component with State

import React, { Component } from 'react';

class CounterClass extends Component {
  constructor(props) {
    super(props);
    this.state = {
      count: 0,
    };
  }

  increment = () => {
    this.setState({ count: this.state.count + 1 });
  };

  decrement = () => {
    this.setState({ count: this.state.count - 1 });
  };

  render() {
    return (
      <div>
        <h1>Count: {this.state.count}</h1>
        <button onClick={this.increment}>Increment</button>
        <button onClick={this.decrement}>Decrement</button>
      </div>
    );
  }
}

export default CounterClass;
Enter fullscreen mode Exit fullscreen mode

In this example:

  • The CounterClass component is a class-based component that uses this.state to manage state and this.setState() to update it.

Using the Class Component
You can use the class component the same way as the functional component:

import React from 'react';
import CounterClass from './CounterClass';

const App = () => {
  return (
    <div>
      <CounterClass />
    </div>
  );
};

export default App;
Enter fullscreen mode Exit fullscreen mode

Step 5: Handling Events in Components

React components can handle events (such as clicks, form submissions, etc.) in a declarative manner.

Example: Button Click Event
Here’s an example of handling a click event in a functional component:

import React from 'react';

const Button = () => {
  const handleClick = () => {
    alert('Button was clicked!');
  };

  return <button onClick={handleClick}>Click Me</button>;
};

export default Button;
Enter fullscreen mode Exit fullscreen mode

In this example:

  • We define a handleClick function that shows an alert when the button is clicked.
  • The onClick event handler is used to trigger the handleClick function when the button is clicked.

Conclusion

Components are the core building blocks of any React application, and understanding how to create, use, and manage components is essential for building dynamic UIs. Here’s a summary of what we’ve covered:

  1. Creating functional components: Simple and reusable UI elements.
  2. Passing data with props: Customizing components by passing data down to them.
  3. Managing state: Using React’s useState hook in functional components to track and update state.
  4. Class components: Using state and lifecycle methods in class-based components.
  5. Handling events: Handling user interactions with event handlers.

By mastering these fundamental concepts, you will be well-equipped to build more complex and interactive React applications !


Top comments (0)