How To Create a Login and Signup Page in React.js

Udemezue John - Oct 6 - - Dev Community

Introduction.

Creating a login and signup page in React is one of the essential tasks when building modern web applications.

Almost 70% of websites on the internet use some form of user authentication, highlighting its significance in both user experience and security.

For many developers, especially those new to React, implementing authentication can feel daunting.

The process involves state management, handling form inputs, validating user data, and securely communicating with a backend server. However, breaking it down step by step makes the task much more manageable.

In this guide, I’ll walk through how to create a responsive and functional login and signup page using React.

How Do I Create a Login and Signup Page in React.js?

Creating a login and signup page is one of the most common tasks when building web applications.

These pages form the foundation of user authentication, allowing individuals to securely access your services.

Let me walk you through a step-by-step process on how to build these components in React.js.

Prerequisites.

Before diving in, ensure you have the following:

  • Basic knowledge of React.js: Familiarity with React components, JSX, and state management is essential.
  • Node.js and npm: These are required to set up the React project. If you're just starting, Node.js can be installed from its official site, which includes npm (Node Package Manager).

1. Setting Up the React Project.

To begin, I'll create a new React application using create-react-app. In the terminal, run:

npx create-react-app auth-demo
cd auth-demo
npm start

Enter fullscreen mode Exit fullscreen mode

This sets up a fresh React project with everything you need to get started. Now that it's running locally, I'll build out the login and signup pages.

Structure of the Project
I'll set up the project like this:

src
│
├── components
│   ├── Login.js
│   ├── Signup.js
│   └── AuthForm.css
├── App.js
└── index.js

Enter fullscreen mode Exit fullscreen mode

2. Creating the Login Page.

Let me start with the login page. I'll create a Login.js file inside the components folder.

// src/components/Login.js

import React, { useState } from 'react';
import './AuthForm.css';

const Login = () => {
  const [email, setEmail] = useState('');
  const [password, setPassword] = useState('');

  const handleSubmit = (e) => {
    e.preventDefault();
    // Here you would typically make an API call to your backend for authentication
    console.log('Email:', email, 'Password:', password);
  };

  return (
    <div className="auth-container">
      <h2>Login</h2>
      <form onSubmit={handleSubmit}>
        <div className="input-container">
          <label>Email:</label>
          <input
            type="email"
            value={email}
            onChange={(e) => setEmail(e.target.value)}
            required
          />
        </div>
        <div className="input-container">
          <label>Password:</label>
          <input
            type="password"
            value={password}
            onChange={(e) => setPassword(e.target.value)}
            required
          />
        </div>
        <button type="submit">Login</button>
      </form>
    </div>
  );
};

export default Login;
Enter fullscreen mode Exit fullscreen mode

In this example, I’ve created a simple login form with two input fields: one for the email and one for the password.

When the user submits the form, the data is logged to the console, but in a real-world application, this is where you’d handle your authentication logic.

3. Creating the Signup Page.

Now, let's work on the signup page by creating Signup.js in the same folder.

// src/components/Signup.js

import React, { useState } from 'react';
import './AuthForm.css';

const Signup = () => {
  const [email, setEmail] = useState('');
  const [password, setPassword] = useState('');
  const [confirmPassword, setConfirmPassword] = useState('');

  const handleSubmit = (e) => {
    e.preventDefault();
    if (password !== confirmPassword) {
      alert('Passwords do not match!');
      return;
    }
    // Typically, you'd send the data to the backend here for registration
    console.log('Email:', email, 'Password:', password);
  };

  return (
    <div className="auth-container">
      <h2>Signup</h2>
      <form onSubmit={handleSubmit}>
        <div className="input-container">
          <label>Email:</label>
          <input
            type="email"
            value={email}
            onChange={(e) => setEmail(e.target.value)}
            required
          />
        </div>
        <div className="input-container">
          <label>Password:</label>
          <input
            type="password"
            value={password}
            onChange={(e) => setPassword(e.target.value)}
            required
          />
        </div>
        <div className="input-container">
          <label>Confirm Password:</label>
          <input
            type="password"
            value={confirmPassword}
            onChange={(e) => setConfirmPassword(e.target.value)}
            required
          />
        </div>
        <button type="submit">Signup</button>
      </form>
    </div>
  );
};

export default Signup;
Enter fullscreen mode Exit fullscreen mode

This component is similar to the login form, but it includes an extra field for confirming the password.

On form submission, I’ve added logic to check if the passwords match. Again, in a real app, this would involve a request to a backend API.

Styling the Forms
To keep the forms looking clean, I'll add some basic styling in AuthForm.css.

/* src/components/AuthForm.css */

.auth-container {
  max-width: 400px;
  margin: 50px auto;
  padding: 20px;
  border: 1px solid #ddd;
  border-radius: 8px;
  background-color: #f9f9f9;
}

.auth-container h2 {
  text-align: center;
  margin-bottom: 20px;
}

.input-container {
  margin-bottom: 15px;
}

.input-container label {
  display: block;
  margin-bottom: 5px;
}

.input-container input {
  width: 100%;
  padding: 8px;
  box-sizing: border-box;
}

button {
  width: 100%;
  padding: 10px;
  background-color: #007bff;
  color: white;
  border: none;
  border-radius: 5px;
  cursor: pointer;
}

button:hover {
  background-color: #0056b3;
}

Enter fullscreen mode Exit fullscreen mode

This basic styling centres the forms on the page and gives them a professional appearance. The forms will look simple but functional.

4. Routing Between Login and Signup Pages.

Now that the login and signup pages are set, I need a way to switch between them.

For this, I’ll set up React Router. If you haven’t installed it yet, you can add it with npm:

npm install react-router-dom

Enter fullscreen mode Exit fullscreen mode

Once that’s done, I'll update App.js to include routes for the login and signup pages.

// src/App.js

import React from 'react';
import { BrowserRouter as Router, Route, Switch, Link } from 'react-router-dom';
import Login from './components/Login';
import Signup from './components/Signup';

function App() {
  return (
    <Router>
      <div className="App">
        <nav>
          <ul>
            <li>
              <Link to="/login">Login</Link>
            </li>
            <li>
              <Link to="/signup">Signup</Link>
            </li>
          </ul>
        </nav>

        <Switch>
          <Route path="/login" component={Login} />
          <Route path="/signup" component={Signup} />
        </Switch>
      </div>
    </Router>
  );
}

export default App;

Enter fullscreen mode Exit fullscreen mode

Here, I’ve added a simple navigation menu to switch between the login and signup pages.

Using react-router-dom, the routes /login and /signup will load the respective components.

5.Handling Form Data (Connecting to Backend).

While the forms currently just log the data to the console, in a real-world application, you'd send this data to a backend API for authentication.

Typically, I’d use a library like axios for making HTTP requests. Here’s a basic example:

Install axios:

npm install axios

Enter fullscreen mode Exit fullscreen mode

Modify the handleSubmit function:

import axios from 'axios';

const handleSubmit = async (e) => {
  e.preventDefault();

  try {
    const response = await axios.post('https://your-api-url.com/login', {
      email,
      password
    });

    // Handle successful login
    console.log(response.data);
  } catch (error) {
    console.error('Error logging in:', error);
  }
};

Enter fullscreen mode Exit fullscreen mode

You would use a similar pattern for the signup form. Ensure your backend is secure and implements best practices like password hashing and token-based authentication.

Wrapping Up.

Building login and signup pages in React.js can be straightforward, but don’t underestimate the importance of making them secure and user-friendly.

With React's component-based architecture, you can easily customize these forms for different projects, and using React Router helps to manage multiple views within the same application.

Now, you have a basic setup for login and signup pages in React.js. I’ve demonstrated form creation, routing, and styling.

All that's left is connecting to a real backend service, which depends on your project's needs—whether you're using Node.js, Django, or another backend technology.

For further learning, I suggest diving into JWT (JSON Web Tokens) for handling user sessions or OAuth for third-party login services like Google or Facebook.

If you're working with RESTful APIs, learning about securing your backend will be crucial as well.

Good luck with your projects!

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Terabox Video Player