shadcn/ui Select Component: 12 Patterns with Code Examples

The shadcn select component installs in one CLI command and builds on Radix UI for full keyboard access. Browse 12 patterns: grouped, icon, async, controlled, and form-integrated selects, with code.

AshFull-stack developer and the maker behind ShadcnDeck. Writes practical guides on React, Next.js, Tailwind, and shadcn/ui — the things he wishes existed when he started.
Published Mar 25, 2026
Updated Jun 27, 2026
15 min read
shadcn/uiReactNext.jsSelect ComponentDropdownForm ComponentsReact Hook FormTypeScriptTailwind CSSRadix UIForm ValidationFrontend Development
shadcn/ui Select Component: 12 Patterns with Code Examples

The shadcn select component is an accessible dropdown built on Radix UI, styled with Tailwind CSS, and added to your project in one CLI command. It handles keyboard navigation, ARIA semantics, and focus management automatically. The underlying @radix-ui/react-select package pulls over 10 million weekly npm downloads, making it one of the most-used dropdown primitives in the React ecosystem.

Building a full form or dashboard? The shadcn components collection covers every primitive you will reach for next.

This guide covers 12 production-ready shadcn select patterns, from basic dropdowns and grouped options to icon selects, async data, React Hook Form integration, and animated transitions, each with complete copy-paste code.

How do I install the shadcn select component?

Installing the shadcn select component takes under two minutes. Run npx shadcn@latest add select in any project that already has shadcn/ui initialised. The CLI installs the Radix UI dependency and copies the component source to components/ui/select.tsx, you own the code from that point forward.

Your project needs:

  • React 19
  • Tailwind CSS configured
  • Radix UI primitives (installed automatically through shadcn/ui)
  • Next.js is recommended but optional

If you don't have shadcn/ui yet, initialize it:

bash

Then install the select component:

bash

Done. This brings in the Radix primitives and the shadcn select component structure. All examples in this guide work without extra setup.

You don't need a specific framework. These examples work in:

  • Next.js
  • Vite
  • Remix
  • Astro (React mode)
  • Any React project using Tailwind

Once this is ready, we can move on to a basic implementation.

What is the basic shadcn select component structure?

Every shadcn select pattern uses four sub-components: Select (root), SelectTrigger (the clickable area), SelectContent (the dropdown panel), and SelectItem (each option). The defaultValue prop sets the pre-selected option. Radix handles ARIA and keyboard navigation automatically.

Here is the minimal working example:

What you see: A clean dropdown that opens on click, supports keyboard navigation, and closes on selection. Focus management and accessibility are handled by Radix.

A few things worth knowing about the shadcn select component:

  • SelectTrigger - Controls the clickable area.
  • SelectValue - Shows the selected option or placeholder.
  • SelectContent - Renders the dropdown menu.
  • SelectItem - Defines each option.

This structure stays the same in every variation that follows. Whether you add icons, grouping, search, or a controlled state, everything builds on this base.

12 shadcn select component patterns for React forms

These 12 patterns cover the most common form and UI scenarios. All share the same four sub-components, only the props, composition, and Tailwind classes change between them.

1. Default Select

This is the plain, no-frills shadcn select version. Clean dropdown. Clear labels. Nothing fancy.

When to use: Most forms. Settings pages. Filters. Anywhere a simple choice is enough. For settings layouts, consider placing the select inside a card-based form layout to visually group related fields.

Key changes from base:

  • No extra styling beyond width.
  • Uses placeholder text for clarity.
  • Keeps interaction predictable.

2. Shadcn Select with Grouped Options

Once your list grows, flat options stop scaling. Grouping keeps things readable.

When to use: Environment selectors, region pickers, categories, roles, permissions.

Why this matters:

  • Reduces cognitive load
  • Scales without UI clutter
  • Still keyboard-accessible

3. Controlled Select (Form / State Driven)

You'll need this the moment the value affects anything else.

Selected: viewer

When to use: Forms, conditional rendering, permissions, filters synced with URL or API.

Key point: This turns shadcn select into a proper controlled React component.

🔁 Controlled selects and controlled tabs share the same pattern. If you're syncing multiple controlled components on the same page, the shadcn tabs component guide covers the same value / onValueChange approach, useful context before you wire them together.

4. Select with Icons (Improves Scan Speed)

Icons help when options represent states, types, or actions.

When to use: Roles, statuses, visibility levels, filters.

Pro tip: Icons should add meaning. If they don't, drop them.

5. Select Integrated with React Hook Form

When you use shadcn select inside real forms, you quickly notice that it isn't a native <select>. Because of that, form libraries like React Hook Form don't pick up its value automatically. This pattern shows how to wire the select component correctly so form state and validation stay in sync.

When to use: When building forms with React Hook Form (or similar libraries) and you need reliable control over the select value. You will often pair select with action buttons for form submission, so it helps to keep both components styled consistently.

Key changes:

  • Value is synced manually using onValueChange
  • Works around non-native select behavior
  • Keeps form state predictable and debuggable

📋 Building a form-heavy product? Our shadcn templates include multi-field forms with selects already wired to React Hook Form, a faster starting point than assembling each piece from scratch.

6. Async / Dynamic Select (API Data)

In real products, select options often come from an API or CMS. This pattern shows how to render shadcn select options dynamically once data is available.

When to use: When select options depend on API responses or external data.

Key changes:

  • Options rendered from state
  • Works with async data sources
  • Same select structure

🎨 Select still looks off after the data loads? The issue is usually theme-level: border color, radius, or focus ring. The Shadcn Theme Generator lets you tweak all of that visually before writing any CSS overrides.

7. Disabled Select (Feature Gating)

Sometimes a select should be visible but not interactive. This pattern is useful for plan limits, onboarding steps, or locked features.

When to use: Subscription gating, permission-based access, or incomplete flows. Adding a helper tooltip for the select field can explain why the dropdown is locked and what the user needs to do to unlock it.

Key changes:

  • Uses the disabled prop
  • No dropdown content required
  • Visual state handled automatically

8. Select with Default Value

When editing existing data, you often need the select to load with a pre-selected value.

When to use: Edit forms, saved preferences, settings pages.

Key changes:

  • Uses defaultValue
  • No controlled state needed
  • Works well for static defaults

9. Controlled Select (Full State Control)

This variation gives you full control over the select value using React state.

Priority: low

When to use: Filters, synced UI state, URL-based selections.

Key changes:

  • Uses value and onValueChange
  • Fully controlled component
  • Predictable behavior

10. Select with Long Lists (Scrollable Content)

Large option lists need scroll behavior to stay usable. For a polished edge fade on long dropdowns, consider adding the scroll-fade utility.

When to use: Country lists, tags, categories, large datasets.

Key changes:

  • max-h added to content
  • Scroll enabled automatically
  • Prevents layout overflow

11. Mobile-Friendly Select

On smaller screens, select triggers should stay compact and easy to tap.

When to use: Mobile-first layouts, responsive forms, compact UIs.

Key changes:

  • Full-width trigger on small screens
  • Responsive sizing
  • Same behavior across breakpoints

12. Animated Select (Subtle Open / Close Transitions)

By default, shadcn select opens instantly. In some interfaces, adding a small animation makes the dropdown feel smoother without hurting usability. This pattern uses Tailwind's data-state attributes exposed by Radix.

🚀 Need selects in a full layout fast? Our free shadcn templates already include filter bars, settings forms, and search UIs with select components baked in, so there's no need to start from zero.

Launch your SaaS faster with a modern Shadcn UI template - Explore Free Templates

Explore more shadcn component guides:

Frequently Asked Questions

Which shadcn select pattern should you use?

Use the default select for simple one-choice fields. Use controlled state when the value drives other UI. Use grouped options when lists exceed 8-10 items. Use async loading when options come from an API. Use the form-integrated pattern whenever React Hook Form or Zod validation is involved.

If you are building a full product UI rather than a single component, ShadcnDeck's shadcn/ui templates ship with forms, selects, and filters already assembled, saving hours of setup. You can also browse select components in real shadcn projects to see how other teams integrate dropdowns in production.

A
Ash

Full-stack developer and the maker behind ShadcnDeck. Writes practical guides on React, Next.js, Tailwind, and shadcn/ui — the things he wishes existed when he started.

Related Articles