React / React Lists / Common List Patterns
Home /React /React Lists /Common List Patterns

Common List Patterns

Common List Patterns

Empty State Handling

JSX
function CourseList({ courses }) {
  // Pattern 1: Early return for empty state
  if (courses.length === 0) {
    return (
      <div className="empty-state">
        <p>📚 No courses yet. Create your first course!</p>
      </div>
    );
  }

  // Pattern 2: Inline ternary in the list render
  return (
    <div>
      {courses.length === 0 ? (
        <p>No courses found.</p>
      ) : (
        <ul>
          {courses.map((c) => <li key={c.id}>{c.title}</li>)}
        </ul>
      )}
    </div>
  );
}

Paginated List

JSX
import { useState } from 'react';

function PaginatedCourses({ courses }) {
  const PAGE_SIZE  = 5;
  const [page, setPage] = useState(1);

  const totalPages = Math.ceil(courses.length / PAGE_SIZE);

  // Slice the correct page of items
  const paginated = courses.slice(
    (page - 1) * PAGE_SIZE,
    page * PAGE_SIZE
  );

  return (
    <div>
      <ul>
        {paginated.map((c) => (
          <li key={c.id}>{c.title}</li>
        ))}
      </ul>

      {/* Pagination controls */}
      <div>
        <button
          onClick={() => setPage((p) => p - 1)}
          disabled={page === 1}
        >← Prev</button>

        {Array.from({ length: totalPages }, (_, i) => (
          <button
            key={i + 1}
            onClick={() => setPage(i + 1)}
            className={page === i + 1 ? 'active' : ''}
          >
            {i + 1}
          </button>
        ))}

        <button
          onClick={() => setPage((p) => p + 1)}
          disabled={page === totalPages}
        >Next →</button>
      </div>
    </div>
  );
}

Grouped / Categorized List

JSX

function GroupedCourses({ courses }) {
  // Group courses by category using reduce()
  const grouped = courses.reduce((acc, course) => {
    const { category } = course;
    if (!acc[category]) acc[category] = [];
    acc[category].push(course);
    return acc;
  }, {});

  // Object.entries gives [['Frontend', [...]], ['Backend', [...]]]
  return (
    <div>
      {Object.entries(grouped).map(([category, items]) => (
        <section key={category}>
          <h3>{category} ({items.length})</h3>
          <ul>
            {items.map((c) => (
              <li key={c.id}>{c.title}</li>
            ))}
          </ul>
        </section>
      ))}
    </div>
  );
}