Demo
Usage
Import the SelectField primitive, and provide a label
for accessibility. The <option>
tags nested inside the component define the available options in the drop-down list.
import { SelectField } from '@aws-amplify/ui-react';
export const DefaultSelectFieldExample = () => (
<SelectField label="Fruit">
<option value="apple">Apple</option>
<option value="banana">Banana</option>
<option value="orange">Orange</option>
<option value="zucchini" disabled>
Zucchini
</option>
</SelectField>
);
Accessibility / Label behavior
Controlled component
To manually control the SelectField state, you can use the value
and onChange
props along with React's useState
hook.
import * as React from 'react';
import { SelectField } from '@aws-amplify/ui-react';
export const SelectFieldControlledExample = () => {
const [value, setValue] = React.useState('');
return (
<SelectField
label="Fruit"
labelHidden
placeholder="This SelectField is manually controlled"
value={value}
onChange={(e) => setValue(e.target.value)}
>
<option value="x">X</option>
<option value="y">Y</option>
<option value="z">Z</option>
</SelectField>
);
};
Options
Create a simple SelectField
by passing a list to the options
prop.
import { SelectField, Flex } from '@aws-amplify/ui-react';
export const SelectFieldOptionsExample = () => (
<Flex direction="column">
<SelectField
label="Animals"
options={['lions', 'tigers', 'bears']}
></SelectField>
<SelectField label="This is the same as the example above">
<option value="lions" label="lions">
lions
</option>
<option value="tigers" label="tigers">
tigers
</option>
<option value="bears" label="bears">
bears
</option>
</SelectField>
</Flex>
);
Sizes
Use the size
prop to change the SelectField size. Available options are small
, large
, and none (default).
import { SelectField, Flex } from '@aws-amplify/ui-react';
export const SelectFieldSizeExample = () => (
<Flex direction="column">
<SelectField size="small" label="small" labelHidden>
<option>small</option>
</SelectField>
<SelectField label="default" labelHidden>
<option>default</option>
</SelectField>
<SelectField size="large" label="large" labelHidden>
<option>large</option>
</SelectField>
</Flex>
);
Variations
There are two variation styles available: default and quiet
.
import { SelectField, Flex } from '@aws-amplify/ui-react';
export const SelectFieldVariationExample = () => (
<Flex direction="column">
<SelectField label="default" labelHidden>
<option>default</option>
</SelectField>
<SelectField variation="quiet" label="quiet" labelHidden>
<option>quiet</option>
</SelectField>
</Flex>
);
Placeholder
Text that appears in the form control when it has no value set.
import { SelectField } from '@aws-amplify/ui-react';
export const SelectFieldPlaceholderExample = () => (
<SelectField
placeholder="This is the placeholder..."
label="placeholderExample"
labelHidden
>
<option value="option">This is the option</option>
</SelectField>
);
Descriptive text
The descriptiveText
prop will only be visible when label
is not hidden (i.e., labelHidden={false}
). You can use it to provide some additional description of the field.
What do you think of the SelectField?
import { SelectField } from '@aws-amplify/ui-react';
export const SelectFieldDescriptiveTextExample = () => (
<SelectField
label="SelectField"
descriptiveText="What do you think of the SelectField?"
>
<option value="amazing">It is amazing</option>
<option value="wow">WOW!</option>
<option value="incredible">Just incredible</option>
</SelectField>
);
Icon
You can change the icon used to expand the SelectField by using the icon
prop. You can also change the icon's color by passing the iconColor
prop.
import { Icon, SelectField } from '@aws-amplify/ui-react';
const IconArrowDropDown = () => {
return <Icon pathData="M7 10L12 15L17 10H7Z" ariaLabel="Down arrow" />;
};
export const SelectFieldIconExample = () => (
<SelectField
label="Icon example"
labelHidden
icon={<IconArrowDropDown />}
iconColor="red"
placeholder="Check out that Icon! ---> "
>
<option value="cool">Pretty cool, right?</option>
</SelectField>
);
Disabled state
A disabled field will not be focusable or mutable, and it will not be submitted with form data. Use the isDisabled
prop to set the state for the SelectField.
import { SelectField } from '@aws-amplify/ui-react';
export const SelectFieldDisabledStateExample = () => (
<SelectField isDisabled label="SelectField" labelHidden>
<option value="option">You cannot view or select this option</option>
</SelectField>
);
Multiple selections
Use the isMultiple
prop to specify that multiple options can be selected at once.
- For Mac: Hold down the command button to select multiple options
- For Windows: Hold down the control button to select multiple options
What's your favorite fruit?
import { SelectField } from '@aws-amplify/ui-react';
export const SelectFieldMultipleStateExample = () => (
<SelectField
label="Fruit"
descriptiveText="What's your favorite fruit?"
isMultiple={true}
>
<option value="apple">Apple</option>
<option value="banana">Banana</option>
<option value="orange">Orange</option>
<option value="pineapple">Pineapple</option>
<option value="kiwi">Kiwi</option>
<option value="tangerine">Tangerine</option>
</SelectField>
);
Select size
Use the selectSize
prop to set the number of visible options in a drop-down list. If the value of the selectSize
attribute is greater than 1, but lower than the total number of options in the list, the browser will add a scroll bar to indicate that there are more options to view.
What's your favorite fruit?
import { SelectField } from '@aws-amplify/ui-react';
export const SelectFieldSelectSizeExample = () => (
<SelectField
label="Fruit"
descriptiveText="What's your favorite fruit?"
selectSize={3}
>
<option value="apple">Apple</option>
<option value="banana">Banana</option>
<option value="orange">Orange</option>
<option value="pineapple">Pineapple</option>
<option value="kiwi">Kiwi</option>
<option value="tangerine">Tangerine</option>
</SelectField>
);
Validation error
Use the hasError
and errorMessage
props to mark a SelectField as having a validation error.
import { SelectField } from '@aws-amplify/ui-react';
export const SelectFieldValidationErrorExample = () => (
<SelectField
label="Fruit"
labelHidden
hasError={true}
errorMessage="This is a required field."
>
<option value="uh oh">Uh oh</option>
</SelectField>
);
Standard HTML attributes
The SelectField
will accept any of the standard HTML attributes that a <select>
element accepts.
Standard <select>
attributes can be found in the MDN Documentation
<SelectField label="Fruit" name="fruit">
<option value="apple">Apple</option>
<option value="banana">Banana</option>
<option value="orange">Orange</option>
</SelectField>
Styling
Theme
You can customize the appearance of all SelectField components in your application with a Theme.
SelectField Theme Source
import { SelectField, ThemeProvider, Theme } from '@aws-amplify/ui-react';
const theme: Theme = {
name: 'selectfield-theme',
tokens: {
components: {
selectfield: {
color: { value: '{colors.blue.60}' },
fontSize: { value: '{fontSizes.large}' },
borderColor: { value: '{colors.red.60}' },
_focus: {
borderColor: { value: '{colors.red.80}' },
},
label: {
color: { value: '{colors.blue.60}' },
},
},
},
},
};
export const SelectFieldThemeExample = () => (
<ThemeProvider theme={theme} colorMode="light">
<SelectField label="Fruit">
<option value="apple">Apple</option>
<option value="banana">Banana</option>
<option value="orange">Orange</option>
</SelectField>
</ThemeProvider>
);
Icons
import { SelectField, IconsProvider } from '@aws-amplify/ui-react';
import { FiChevronsDown } from 'react-icons/fi';
export const SelectFieldIconProviderExample = () => (
<IconsProvider
icons={{
select: {
expand: <FiChevronsDown />,
},
}}
>
<SelectField label="Fruit">
<option value="apple">Apple</option>
<option value="banana">Banana</option>
<option value="orange">Orange</option>
</SelectField>
</IconsProvider>
);
Target classes
Class | Description |
---|---|
amplify-select | Class applied to the select element |
amplify-selectfield | Top level element that wraps the SelectField primitive |
amplify-select__wrapper | Class applied to the select wrapper |
amplify-select__icon | Class applied to the select icon wrapper |
--amplify-components-selectfield-border-color
--amplify-components-selectfield-color
--amplify-components-selectfield-flex-direction
--amplify-components-selectfield-focus-border-color
--amplify-components-selectfield-font-size
--amplify-components-selectfield-label-color
Global styling
To override styling on all SelectFields, you can set the Amplify CSS variables with the built-in .amplify-selectfield
class.
/* styles.css */
.amplify-selectfield {
--amplify-components-fieldcontrol-border-color: rebeccapurple;
}
Local styling
To override styling on a specific SelectField
, you can use a class selector or style props.
Using a class selector:
/* styles.css */
.my-custom-selectfield .amplify-select {
border-radius: 0;
}
Using style props:
import { SelectField, useTheme } from '@aws-amplify/ui-react';
export const SelectFieldStylePropsExample = () => {
const { tokens } = useTheme();
return (
<>
<SelectField
label="Fruit"
padding="xl"
border={`1px solid ${tokens.colors.primary[60]}`}
>
<option value="apple">Apple</option>
<option value="banana">Banana</option>
<option value="orange">Orange</option>
</SelectField>
<SelectField
label="Fruit"
inputStyles={{
backgroundColor: 'primary.10',
border: `1px solid ${tokens.colors.primary[60]}`,
}}
>
<option value="apple">Apple</option>
<option value="banana">Banana</option>
<option value="orange">Orange</option>
</SelectField>
</>
);
};