Skip to main content

Select

Select Field Component​

The Select field provides dropdown selection functionality, supporting both static options and dynamic data loaded from APIs. It's ideal for single or multi-select scenarios with large option sets.

Core Properties​

interface SelectFieldType extends BaseField {
type: "select";
options?: Array<string | { value: string | number, label: string | number }>;
dynamicOptions?: {
endpoint: string; // API URL (supports {{fieldId}} placeholders)
method?: "GET" | "POST"; // HTTP method (default: GET)
dependsOn?: string | string[]; // Dependent fields for dynamic queries
params?: Record<string, string>; // Query parameters
transformResponse?: (data: any) => Option[]; // Convert API response
fetchOnInit?: boolean; // Load options on mount
};
placeholder?: string; // Default prompt text
isMulti?: boolean; // Enable multi-select
}

Basic Usage​

function StaticSelectExample() {
const schema = {
formId: "static-select",
fields: [{
fieldId: "education",
type: "select",
label: "Highest Education",
options: ["High School", "Bachelor's", "Master's", "PhD"],
required: true,
placeholder: "Select your degree"
}]
};
return <DynamicForm formData={schema} />;
}

Label/Value Pairs​

{
fieldId: "subscription",
type: "select",
options: [
{ value: "basic", label: "Basic Plan ($9.99)" },
{ value: "pro", label: "Pro Plan ($19.99)" }
],
_defaultValue: "basic"
}

Dynamic Options from API​

Basic API Fetch​

{
fieldId: "products",
type: "select",
dynamicOptions: {
endpoint: "/api/products",
transformResponse: (data) =>
data.map(product => ({
label: product.name,
value: product.id
}))
}
}

Dependent Dropdowns​

{
fieldId: "city",
type: "select",
dynamicOptions: {
endpoint: "/api/cities",
dependsOn: ["country"], // Reload when country changes
params: {
countryId: "{{country}}" // Template placeholder
}
}
}

Advanced Features​

Multi-Select​

{
fieldId: "skills",
type: "select",
isMulti: true, //add this to enable the multi-select
options: ["JavaScript", "TypeScript", "React", "Node.js"]
}

Paginated API Results​

{
fieldId: "users",
type: "select",
dynamicOptions: {
endpoint: "/api/users",
pagination: {
pageSize: 20,
loadMoreText: "Load more users..."
}
}
}

Validation Examples​

Required Selection​

{
fieldId: "country",
type: "select",
required: true,
requiredMessage: "Please select your country"
}

Minimum Selections​

{
fieldId: "languages",
type: "select",
isMulti: true,
validation: [{
minItems: 2,
message: "Select at least 2 languages"
}]
}

Performance Tips​

  1. Debounce API Calls
    For searchable selects, add debouncing to dynamic options:
dynamicOptions: {
endpoint: "/api/search?term={{search}}",
debounce: 300 // ms delay
}
  1. Initial Data Loading
    Combine static and dynamic options for better UX:
options: [{ label: "Loading...", value: "" }], // Initial placeholder
dynamicOptions: {
endpoint: "/api/options",
fetchOnInit: true
}
  1. Accessibility
{
fieldId: "accessible-select",
type: "select",
ariaLabel: "Select your preferred contact method",
// Screen reader instructions:
description: "Use arrow keys to navigate options"
}
Clicky