askvity

How to Make a Typing Animation in React

Published in React Typing Animation 5 mins read

Creating a typing animation, often called a typewriter effect, in React involves progressively displaying characters of a string over time. You achieve this by managing the currently displayed text in the component's state and updating it using timers.

Understanding the Core Concept

At its heart, a React typing animation works by:

  1. Storing the complete string you want to type.
  2. Storing the portion of the string that is currently visible.
  3. Using a timer (like setTimeout or setInterval) to add the next character from the complete string to the visible portion at a set interval.
  4. Rendering the visible portion.

As stated in the provided reference, a React component handles this:

1return (
2  <h1>{text}</h1>
3);
4
5export default Typewriter;

This code snippet demonstrates the final step: rendering the text state within an <h1> tag. This text state is the dynamic part that updates character by character to create the animation.

Step-by-Step Guide to Building a Typewriter Component

Here's a common approach to build a reusable Typewriter component in React:

1. Set up the Component Structure

Create a new functional component, let's call it Typewriter.js.

import React, { useState, useEffect } from 'react';

function Typewriter({ text, delay }) {
  // State to hold the currently displayed text
  const [displayText, setDisplayText] = useState('');
  // State to track the index of the character to display next
  const [currentIndex, setCurrentIndex] = useState(0);

  useEffect(() => {
    // Set up a timer to add a character at a time
    if (currentIndex < text.length) {
      const timeoutId = setTimeout(() => {
        setDisplayText(prevText => prevText + text[currentIndex]);
        setCurrentIndex(prevIndex => prevIndex + 1);
      }, delay); // 'delay' controls the typing speed

      // Clean up the timer when the effect re-runs or component unmounts
      return () => clearTimeout(timeoutId);
    }
  }, [currentIndex, delay, text]); // Effect depends on these values

  // Render the current displayText within an HTML element
  return (
    <h1>{displayText}</h1>
  );
}

export default Typewriter;

Explanation:

  • useState hooks:
    • displayText: Stores the string that is currently rendered. It starts empty.
    • currentIndex: Tracks which character from the full text prop should be added next.
  • useEffect hook:
    • Runs whenever currentIndex, delay, or text changes.
    • It checks if there are more characters to type (currentIndex < text.length).
    • If yes, it sets a setTimeout.
    • The setTimeout callback appends the next character (text[currentIndex]) to displayText and increments currentIndex.
    • The return () => clearTimeout(timeoutId); is crucial for cleaning up the timer, preventing memory leaks and unexpected behavior, especially if props change.
  • The return statement renders the displayText within an <h1> tag. This directly relates to the reference: 1return ( 2 <h1>{text}</h1> 3);. The state variable name might differ (displayText vs. text), but the principle of rendering the evolving state is the same.

2. Using the Component

Import and use the Typewriter component in your main application file (e.g., App.js).

import React from 'react';
import Typewriter from './Typewriter'; // Adjust the path if necessary

function App() {
  return (
    <div className="App">
      <h2>React Typing Animation Example</h2>
      {/* Use the Typewriter component */}
      <Typewriter text="Hello, React world!" delay={100} />
    </div>
  );
}

export default App;

Here:

  • text: The full string you want to animate.
  • delay: The time in milliseconds between typing each character (controls speed).

3. Customization and Enhancements

You can extend this basic component with more features:

  • Cursor: Add a blinking cursor at the end of the typed text.
  • Looping: Make the animation loop, potentially with a backspace effect.
  • Pausing: Implement functionality to pause or resume the animation.
  • Different Elements: Allow the user to specify which HTML tag (h1, p, span, etc.) to use.
  • Callback: Trigger a function when the typing is complete.
Feature How to Implement (Basic Idea)
Cursor Append a blinking element (<span>|</span>) after displayText.
Looping Add state to track the typing phase (typing/deleting) and reset currentIndex/displayText when finished.
Speed Control the delay prop.
HTML Tag Accept a tag prop and use React.createElement or dynamic JSX.

Reference Confirmation

The provided reference 1return ( 2 <h1>{text}</h1> 3); 4 5export default Typewriter; aligns with the structure of a basic React component that renders dynamic text ({text}) and is exported as Typewriter. This rendering part is the visual output of the state changes driven by the useEffect timer.

Conclusion

By using useState to manage the visible text and useEffect with setTimeout to control the timing of character additions, you can effectively create a typing animation effect in your React applications, as demonstrated by the structure involving rendering a state variable within an HTML element like <h1>.

Related Articles