Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

iTechGuides is reader-supported. When you buy through links on our site, we may earn an affiliate commission. As an Amazon Associate I earn from qualifying purchases. Learn more

A lightweight React Kanban board works best when its columns and cards live in one clear data model, React renders that model, and every action updates it immutably. Start with stable IDs, keep derived display values out of state, and make card movement possible by keyboard as well as pointer.

Set up React with Vite

Use Vite’s current React template and setup instructions rather than relying on commands or runtime requirements that may have changed. The official Vite Getting Started guide covers project creation, development, and production builds. Recheck it when setting up a new project.

Choose a board data shape

For a small board, nesting each column’s ordered cards keeps the model easy to read and render. Give every column and card a stable, unique ID; titles and positions can change, but identity should not.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
const initialBoard = [
  {
    id: "todo",
    title: "To do",
    cards: [
      { id: "card-1", title: "Draft the outline" },
      { id: "card-2", title: "Review the brief" }
    ]
  },
  { id: "doing", title: "In progress", cards: [] },
  { id: "done", title: "Done", cards: [] }
];

This shape makes rendering a column’s cards and updating its contents straightforward. A move between columns requires locating the source and destination, removing the card from one array, then inserting it into the other. If cross-column operations, ordering rules, or persistence become harder to manage, consider normalized data: keep columns by ID and cards in a separate collection with a column ID and ordering information. That adds indirection but can make relationships and moves more explicit.

#1 Best Overall
PMXBOARD 4-Column Magnetic Kanban Board Kit – Board + 64 Magnetic Cards | Flex Dry Erase Scrum & Project Planning Whiteboard
  • Complete 4-column magnetic Kanban board kit: flex dry-erase board plus 64 magnetic Agile cards and accessories — a full board system, not a cards-only pack.
  • 64 magnetic cards included: task, detail, blocker, and blank headline cards so you can run To Do / Doing / Done / custom workflows and wipe cards clean for reuse.
  • Thin, light flex board (about 6 lb) with strong magnetism: hang with included hardware/adhesive or move between rooms without a bulky framed panel.
  • Customize all four column headlines with blank magnetic header cards; write on the board and on the cards with the included markers.
  • Built for small teams and project planning: clearer than sticky notes, ready for standups, Scrum, or personal Kanban on wall or table.

Render collections with stable identity

Map the board arrays into components, and use each item’s ID as its React key. Keys help React associate rendered items with their identity when items are inserted, deleted, or moved; an array index is not a reliable key for movable cards. See React’s Rendering Lists guidance.

function Board({ columns, onMoveCard, onDeleteCard }) {
  return (
    <main className="board" aria-label="Kanban board">
      {columns.map((column) => (
        <Column
          key={column.id}
          column={column}
          onMoveCard={onMoveCard}
          onDeleteCard={onDeleteCard}
        />
      ))}
    </main>
  );
}

function Column({ column, onMoveCard, onDeleteCard }) {
  return (
    <section className="column" aria-labelledby={`heading-${column.id}`}>
      <h2 id={`heading-${column.id}`}>{column.title}</h2>
      <ul className="card-list">
        {column.cards.map((card) => (
          <li key={card.id}>
            <Card
              card={card}
              columnId={column.id}
              onMoveCard={onMoveCard}
              onDeleteCard={onDeleteCard}
            />
          </li>
        ))}
      </ul>
    </section>
  );
}

Splitting the UI into Board, Column, Card, and a card form keeps rendering responsibilities understandable. Keep update functions in the lowest shared component that can coordinate the changes across columns; move to a reducer if related transitions become difficult to follow.

Rank #2
VIZ-PRO Magnetic Dry Erase Board, 36 X 24 Inches, Silver Aluminium Frame
  • 【Smooth Writing and Easy to Wipe】Magnetic whiteboard, overall size: 35.4" x 23.6" ( frame included); writing surface size: 33.9" x 22.1". Smooth & durable magnetic writing surface, easily dry wipe with all dry-erase markers. Give you a very smooth writing experience.
  • 【Premium Quality】Specially lacquered surface, anti-scratch silver finished aluminium frame, ABS plastic corner with screw-fixing in corners. Fixing kits and detachable marker tray included.
  • 【Versatile Installation】Flexible mounting allows you to install your whiteboard either horizontally or vertically. Easily customize the board's orientation to fit your space and needs. The classic design will match any decoration, making it a perfect addition to your space.
  • 【Multiple Uses】It is a good choice for home, school, office, small group instruction, kitchen, stores, dormitory and classroom etc. Perfect for play counting, guided reading, learning, presentation, drawing, education and grocery list etc, without paper wasting.
  • 【Warmly Remind】If you have any questions about VIZ-PRO whiteboard, please contact us by e-mail freely, Surely help you solve the problems.

Keep one source of truth for changing board data

Store the board data that changes in React state. Compute display-only information, such as card counts, from that state rather than maintaining a second copy that can become inconsistent. React’s Thinking in React explains how to keep state minimal and derive values that can be calculated.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

When adding, editing, deleting, or moving cards, create new arrays and objects instead of mutating existing state. React’s Updating Arrays in State describes non-mutating update patterns; Adding Interactivity covers state updates in response to user actions.

Rank #3
Scrum on the Go Board 12" X 18" Board, Folds to 9" x 12". Used and Designed by Navy Seals (1)
  • Folding, portable, lightweight dry erase SCRUM Board
  • Works with dry erase and chalkboard markers
  • Great for organizing tasks and projects
  • Measures 12" x 18", but folds to 9" x 12" for easy transport
  • Magnets can stick to both sides of the board

Add a card

Create the new card with a stable ID, then return a new board array and a new target column object with the card appended. Generate the ID when the action occurs, not during rendering, so it stays stable.

Delete or edit a card

For deletion, return a new board with the matching card filtered out of its column. For an edit, map the relevant card array and replace the matching card with a new object containing the changed fields. Leave untouched columns and cards unchanged where possible.

Rank #4
cridoz 15 Rolls Thin 1/8 Inch (3mm) Whiteboard Tape, Low-Tack Paper Pinstripe Art Grid Lines Tape for Dry Erase Boards, Crafts & Delicate Surfaces - Assorted Colors
  • Precision Size & What's Included: You will receive 15 rolls of ultra-thin whiteboard tape in a 1/8 inch (approx. 3mm) width. IMPORTANT NOTE: This is a delicate, low-tack paper tape designed for gentle applications. It is not suitable for rough, dirty surfaces or tasks requiring strong adhesion. Please consider this before purchasing.
  • Gentle & Residue-Free: This low-tack tape applies and removes effortlessly from smooth surfaces (like whiteboards, glass, finished wood) without leaving any sticky residue. Its delicate nature makes it ideal for crafting and painting, not for heavy-duty or permanent tasks.
  • Perfect Use Cases: The ultra-thin width is perfect for creating grids on whiteboards, detailed art projects, decorative accents, marking instrument fingerboards, and protecting edges during painting. For best results, ensure the application surface is clean, dry, smooth, and free of dust or oil.
  • Usage Guide for Best Adhesion: To ensure the tape sticks well, please note:1) Surfaces must be smooth and clean. 2) Adhesion is temperature-sensitive. Reduced stickiness in cooler environments (e.g., during winter) is normal.
  • Color Assortment Note: This set includes 15 rolls in a variety of assorted colors. Please be aware that while we strive for color diversity, the exact color combination may vary slightly between production batches.

Move a card

For a move, find the card by ID, create a source column without it, and a destination column with it inserted at the chosen position. Return a new board array containing updated column objects. Treat the move as one state transition so the card does not exist in both columns or disappear between separate updates.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
function moveCard(board, cardId, fromColumnId, toColumnId, toIndex) {
  if (fromColumnId === toColumnId) return board;

  const source = board.find((column) => column.id === fromColumnId);
  const destination = board.find((column) => column.id === toColumnId);
  const card = source?.cards.find((item) => item.id === cardId);
  if (!source || !destination || !card) return board;

  return board.map((column) => {
    if (column.id === fromColumnId) {
      return { ...column, cards: column.cards.filter((item) => item.id !== cardId) };
    }
    if (column.id === toColumnId) {
      const cards = [...column.cards];
      cards.splice(toIndex, 0, card);
      return { ...column, cards };
    }
    return column;
  });
}

This example handles a cross-column move. Reordering within the same column needs its own remove-and-insert path because the source and destination are the same array. Validate the target index against the current array length if it can come from an external interaction.

Best Value
Dry Erase Magnets, 24 Pack 4x4 in, Magnetic Notes for Whiteboard and Fridge
  • EXTRA STRONG MAGNET - Erasable magnets hold firmly to metal whiteboards, locker doors, fridge, file cabinets and metal shelves - stay flat and stable on all metal surfaces.
  • ERASES CLEAN - Simply write and erase - smooth whiteboard surface wipes clean day after day, month after month. No stains, no paper waste, no missed deadlines!
  • STAY ORGANIZED - Ideal for kanban boards, scrum boards, meal or project planning - move and rearrange magnetic notes without losing track. Perfect chore magnets for household schedules, to-do lists and office tasks.
  • REUSABLE MAGNETIC LABELS - Write on magnets used as magnetic index cards, note pads, name tags, locker strips or dry erase accessories for any whiteboard, magnetic board or refrigerator.
  • COMPLETE KIT - READY TO USE - Dry erase magnetic note pads plus erasing cloth. For whiteboard, locker, fridge door, shelf, office, cubicle, dorm and kitchen. Designed for home and office planning.
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Make board actions understandable and keyboard-accessible

Use semantic elements for the board, columns, lists, and controls. Give buttons descriptive accessible names, ensure focus remains visible, and present status or priority with text or another cue in addition to color. The W3C’s Accessibility Principles describe these broader practices.

Every operation must be available without a mouse. A drag gesture alone is not sufficient: provide an equivalent keyboard-operated control, such as a move menu or buttons that move a card to an adjacent column. Make focus order predictable, and avoid trapping keyboard focus, as explained in W3C WAI’s Keyboard Accessibility guidance. That guidance establishes the keyboard requirement, not a particular Kanban interaction pattern, so choose controls that fit the board and verify their behavior.

Style the board with plain CSS

Use CSS for layout, spacing, responsive behavior, and hierarchy without adding a framework. A grid or flex layout can place columns side by side on wider screens and allow horizontal scrolling or stacking on narrower ones. Keep card boundaries, headings, and action controls visually distinct; preserve a clear focus indicator when styling buttons and form fields.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
.board {
  display: grid;
  grid-auto-columns: minmax(16rem, 1fr);
  grid-auto-flow: column;
  gap: 1rem;
  overflow-x: auto;
  padding: 1rem;
}

.column {
  min-width: 16rem;
  padding: 1rem;
  border: 1px solid #cbd5e1;
  border-radius: 0.75rem;
  background: #f8fafc;
}

.card-list {
  display: grid;
  gap: 0.75rem;
  padding: 0;
  list-style: none;
}

button:focus-visible,
input:focus-visible {
  outline: 3px solid #1d4ed8;
  outline-offset: 2px;
}

Adjust the layout to the actual content and test it at narrow widths. Do not use color as the sole way to communicate a card’s state or importance.

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.