Blog/NotesConcept

Implementing a stopwatch using React - Frontend Machine Coding Question

Concise explanation of stopwatch implementation using React, it involves the usage of useEffect hook for creating a stopwatch and tracking milliseconds.

beginner

Pallavi Gupta

Last Updated Feb 21, 2025


Advertisement

Stopwatch implementation is one of the most commonly asked Frontend Machine Coding Question, and this machine coding question helps to evaluate the understanding of useEffect hook as part of react application. In this post, we will going to understand the implementation of a stopwatch using React that tracks elapsed time in hours, minutes, and seconds.

StopWatch implementation using react

Component States & Hooks

It uses the useState hook to manage 2 component states to track time and status. [ millisecond, setMillisecond] state is used to track the time in milliseconds and [isActive, setIsActive] is used to track the active status of the watch.

The useEffect hook handles the timer functionality, starting an interval that increments the time every second when isActive is true and clearing the interval when paused.

Formatting Functions

A formatting function formatTime converts the elapsed time into a readable HH:MM:SS format. The component displays the time in a styled black-and-white layout and provides three buttons—Start, Pause, and Reset—to control the stopwatch.

Overall, this component demonstrates efficient state management, side effects handling with useEffect, and UI updates in real time, making it a great frontend machine coding question of how to build an interactive timer in React. 🚀

StopWatch React Component

React Component

import { useEffect, useState } from "react";
import "./styles.css";

function StopWatch() {
  const [millisecond, setMillisecond] = useState(0);
  const [isActive, setIsActive] = useState(false);

  useEffect(() => {
    let interval = null;
    if (isActive) {
      interval = setInterval(() => {
        setMillisecond((prevTime) => prevTime + 1);
      }, 1000);
    }
    return () => clearInterval(interval);
  }, [isActive]);

  const formatTime = (seconds) => {
    const hours = Math.floor(seconds / 3600);
    const minutes = Math.floor(seconds / 60) % 60;
    const sec = Math.floor(seconds % 60);
    return {
      hours: String(hours).padStart(2, "0"),
      minutes: String(minutes).padStart(2, "0"),
      sec: String(sec).padStart(2, "0"),
    };
  };

  const { hours, minutes, sec } = formatTime(millisecond);
  const handleStart = () => {
    setIsActive(true);
  };
  const handlePause = () => {
    setIsActive(false);
  };
  const handleReset = () => {
    setIsActive(false);
    setMillisecond(0);
  };

  return (
    <div className="container">
      <div>
        <h1>Stop Watch</h1>
        <div className="d-flex timeGroup">
          <div className="time">{hours}</div>
          <div className="time">{minutes}</div>
          <div className="time">{sec}</div>
        </div>
        <div className="d-flex buttonGroup">
          <div className="div">
            <button onClick={handleStart}>Start</button>
          </div>
          <div className="div">
            <button onClick={handlePause}>Pause</button>
          </div>
          <div className="div">
            <button onClick={handleReset}>Reset</button>
          </div>
        </div>
      </div>
    </div>
  );
}

export default StopWatch;

Component Styles

// styles.css

.container {
  display: flex;
  justify-content: center;
}

.time {
  width: 33%;
  padding: 0.5rem;
  color: white;
  background-color: skyblue;
  border: 1px solid #eee;
}

.buttonGroup {
  display: flex;
  justify-content: space-between;
  width: 200px;
  margin-top: 1rem;
}

.timeGroup {
  display: flex;
  width: 200px;
}

Share this post now:

Advertisement

💬 Comments (0)

Login to comment

Advertisement

Flaunt You Expertise/Knowledge & Help your Peers

Sharing your knowledge will strengthen your expertise on topic. Consider writing a quick Blog/Notes to help frontend folks to ace Frontend Interviews.

Advertisement


Other Related Blogs

Master Hoisting in JavaScript with 5 Examples

Alok Kumar Giri

Last Updated Jun 2, 2025

Code snippet examples which will help to grasp the concept of Hoisting in JavaScript, with solutions to understand how it works behind the scene.

Best Cheat Sheet for Frontend Machine Coding Interview Round

Anuj Sharma

Last Updated Jun 13, 2025

A comprehensive cheat sheet for the Frontend Machine Coding Interview Round, which helps to revise all the important machine coding & UI design concepts before the interview.

HTTP/2 vs HTTP/1.1: What's the Key Difference?

Anuj Sharma

Last Updated Jan 29, 2025

Understand the difference between HTTP/2 vs HTTP/1.1 based on the various parameters, which helps to understand the improvement areas of HTTP/2 over HTTP 1.1

Part 1: From Zero to Published — How I Built and Published My First React NPM Package

Akash Deep Chitransh

Last Updated May 26, 2025

Learn how to build and publish your own NPM package with Rollup, testing, and troubleshooting. Stay tuned for part 2: building a React state management library!

Understand JavaScript Date Object with Examples (for JavaScript Interviews)

Anuj Sharma

Last Updated Jan 9, 2025

Go through different ways to display dates using javascript date object. It covers examples of date object usage to understand the main concepts of javascript date object.

Promise.all Polyfill in JavaScript - Detailed Explanation [For Interviews]

Anuj Sharma

Last Updated Jan 16, 2025

Deep dive into promise.all polyfill in javascript will help to understand the working of parallel promise calls using Promise.all and its implementation to handle parallel async API calls.

FrontendGeek
FrontendGeek

© 2024 FrontendGeek. All rights reserved