React Beginner's Guide: Build Apps Fast with Vite & Best Practices

Learn how to build robust React applications from scratch using Vite. This guide covers setup, components, props, state, routing, styling, and API integration—perfect for backend and API-focused teams seeking performance and maintainability.

Audrey Lopez

Audrey Lopez

20 January 2026

React Beginner's Guide: Build Apps Fast with Vite & Best Practices

Welcome, API-driven developers and aspiring React engineers! If you're looking to master React for high-performance, maintainable web applications, you've landed in the right place. This hands-on guide walks you through setting up a modern React environment, building reusable components, managing state, handling events, and implementing routing—all with practical code examples.

Whether you’re crafting interactive frontends or building robust API integrations, understanding React fundamentals will accelerate your workflow and improve the developer experience for your entire team.

💡 Looking for an API platform that generates beautiful API Documentation and streamlines team productivity? Try Apidog—an all-in-one solution that maximizes collaboration and even replaces Postman at a better price.

button

Set Up a Modern React Development Environment

Before building features, you need a fast, reliable workspace that aligns with professional standards.

1. Install Node.js and npm

React projects use Node.js (JavaScript runtime) and npm (Node package manager):

To get started:

2. Create a React Project with Vite

Vite is the modern standard for React scaffolding—offering faster builds and instant updates.

To initialize your project:

npm create vite@latest my-first-react-app -- --template react
cd my-first-react-app
npm install
npm run dev

Core React Concepts: Components & JSX

What Are Components?

React is built on components—modular, reusable UI pieces. Think of each as a self-contained “brick” that can be combined to build complex interfaces.

Example: Your main App component (src/App.jsx):

function App() {
  return (
    <div>
      <h1>Hello, React World!</h1>
      <p>This is my very first React component.</p>
    </div>
  );
}
export default App;

Understanding JSX (JavaScript XML)

JSX allows you to write HTML-like syntax inside JavaScript—making UI logic readable and expressive.

Example with JavaScript expressions:

function App() {
  const name = "API Developer";
  const year = new Date().getFullYear();
  return (
    <div>
      <h1>Hello, {name}!</h1>
      <p>Welcome to your React journey in {year}.</p>
    </div>
  );
}

Vite’s Hot Module Replacement (HMR) updates your browser instantly after every save.


Build and Compose Custom Components

Create & Use Your Own Component

Create src/Greeting.jsx:

function Greeting() {
  return (
    <h2>This is a greeting from my custom component!</h2>
  );
}
export default Greeting;

Import and use it in App.jsx:

import Greeting from './Greeting';
function App() {
  return (
    <div>
      <h1>Hello, API Developer!</h1>
      <Greeting />
    </div>
  );
}

Composing UIs with reusable components is the React way.


Pass Data Between Components: Props

Props let you pass data from parent to child components, making your UI dynamic.

Update Greeting.jsx to accept a name prop:

function Greeting({ name }) {
  return (
    <h2>Hello, {name}! This is a greeting from my custom component.</h2>
  );
}
export default Greeting;

Use it multiple times in App.jsx:

<Greeting name="Alice" />
<Greeting name="Bob" />
<Greeting name="Charlie" />

Props make components flexible and reusable.


Manage Local State with useState

While props pass data down, state lets a component “remember” values and update its UI in response.

useState: Interactive Components

Create src/Counter.jsx:

import { useState } from 'react';
function Counter() {
  const [count, setCount] = useState(0);
  return (
    <div>
      <p>You clicked {count} times</p>
      <button onClick={() => setCount(count + 1)}>
        Click me
      </button>
    </div>
  );
}
export default Counter;

Add <Counter /> to App.jsx to display a working counter.


Handle User Events and Forms

Interactivity is crucial for modern web apps. React standardizes event handling for consistency.

Example: Controlled form component in NameForm.jsx:

import { useState } from 'react';
function NameForm() {
  const [name, setName] = useState('');
  const handleSubmit = (event) => {
    event.preventDefault();
    alert(`Hello, ${name}!`);
  };
  return (
    <form onSubmit={handleSubmit}>
      <label>
        Name:
        <input
          type="text"
          value={name}
          onChange={e => setName(e.target.value)}
        />
      </label>
      <button type="submit">Submit</button>
    </form>
  );
}
export default NameForm;

Add this to your app and see live input handling in action.


Conditional Rendering & Lists

Show/Hide UI with Conditions

Example:

function LoginMessage({ isLoggedIn }) {
  return (
    <div>
      {isLoggedIn ? <h2>Welcome back!</h2> : <h2>Please log in.</h2>}
    </div>
  );
}

Pass isLoggedIn={true} or false to show different messages.

Render Lists Dynamically

Example: Displaying a fruit list in FruitList.jsx:

const fruits = ['Apple', 'Banana', 'Cherry', 'Date'];
<ul>
  {fruits.map((fruit, idx) => (
    <li key={idx}>{fruit}</li>
  ))}
</ul>

For professional apps, use unique IDs as keys when possible.


Style Your React Application

Standard CSS

Add styles to src/App.css and use class names in components.

/* src/App.css */
.fruit-list { list-style: none; padding: 0; }
.fruit-item { background: #f0f0f0; margin: 5px 0; padding: 10px; border-radius: 5px; }
<ul className="fruit-list">
  {fruits.map((fruit, idx) => (
    <li key={idx} className="fruit-item">{fruit}</li>
  ))}
</ul>

CSS Modules

For scalable apps, use CSS Modules for component-scoped styles.

/* src/FruitList.module.css */
.list { list-style-type: square; }
.item { color: blue; }
import styles from './FruitList.module.css';
<ul className={styles.list}>
  {fruits.map((fruit, idx) => (
    <li key={idx} className={styles.item}>{fruit}</li>
  ))}
</ul>

Add Navigation: React Router

Most real-world apps require multiple pages—React Router enables SPA navigation.

Install and Configure

npm install react-router-dom

Create page components (HomePage.jsx, AboutPage.jsx) and set up routes:

import { BrowserRouter as Router, Routes, Route, Link } from 'react-router-dom';
import HomePage from './HomePage';
import AboutPage from './AboutPage';

function App() {
  return (
    <Router>
      <nav>
        <ul>
          <li><Link to="/">Home</Link></li>
          <li><Link to="/about">About</Link></li>
        </ul>
      </nav>
      <Routes>
        <Route path="/" element={<HomePage />} />
        <Route path="/about" element={<AboutPage />} />
      </Routes>
    </Router>
  );
}

Navigation happens instantly—no full page reload required.


Side Effects & Data Fetching: useEffect

For API calls, logging, or subscriptions, use the useEffect hook.

Example: Fetch data from a public API (DataFetcher.jsx):

import { useState, useEffect } from 'react';
function DataFetcher() {
  const [data, setData] = useState(null);
  const [loading, setLoading] = useState(true);
  useEffect(() => {
    const fetchData = async () => {
      try {
        const response = await fetch('https://jsonplaceholder.typicode.com/posts/1');
        const jsonData = await response.json();
        setData(jsonData);
      } catch (error) {
        console.error('Error:', error);
      } finally {
        setLoading(false);
      }
    };
    fetchData();
  }, []);
  if (loading) return <p>Loading...</p>;
  return (
    <div>
      <h3>Fetched Data:</h3>
      <h4>{data.title}</h4>
      <p>{data.body}</p>
    </div>
  );
}
export default DataFetcher;

This pattern is ideal for integrating with REST APIs and backend services.


Next Steps: Grow Your React Skillset

You now have a production-quality React foundation—ready for integration with APIs and scalable architectures.

For further growth:

For API development teams, leveraging tools like Apidog can streamline your API documentation, testing, and collaboration workflows. Apidog's API documentation generation, team productivity suite, and cost-effective Postman alternative make it a strong choice for scalable developer operations.

button

Explore more

How to Use Claude Code for CI/CD Workflows

How to Use Claude Code for CI/CD Workflows

Technical guide to integrating Claude Code into CI/CD pipelines. Covers container setup, GitHub Actions/GitLab CI integration, skill development, and practical workflows for DevOps automation.

21 January 2026

How to Use Claude Code Skills for API Request/Networking (data-fetching)

How to Use Claude Code Skills for API Request/Networking (data-fetching)

Technical guide to using Claude Code skills for API networking. Covers setup, core request patterns, advanced scenarios, and practical examples for building AI-driven data-fetching workflows.

21 January 2026

How to Use Claude Code Skills for Building UI

How to Use Claude Code Skills for Building UI

Technical guide to using Claude Code skills for UI development. Covers setup, core tools, advanced patterns, and debugging for building production-ready React/Vue/Svelte components.

21 January 2026

Practice API Design-first in Apidog

Discover an easier way to build and use APIs