diff --git a/packages/@react-aria/select/src/HiddenSelect.tsx b/packages/@react-aria/select/src/HiddenSelect.tsx index b0d61ddc2aa..76b0b884c8a 100644 --- a/packages/@react-aria/select/src/HiddenSelect.tsx +++ b/packages/@react-aria/select/src/HiddenSelect.tsx @@ -141,13 +141,19 @@ export function HiddenSelect(props: HiddenSelectProps): JSX.Element | null ); } else if (name) { + let data = selectData.get(state) || {}; + // Use a hidden rather than + // so that an empty value blocks HTML form submission when the field is required. return ( + value={state.selectedKey ?? ''} + onChange={() => {/** Ignore react warning. */}} + required={data.isRequired} + hidden /> ); } diff --git a/packages/react-aria-components/stories/Select.stories.tsx b/packages/react-aria-components/stories/Select.stories.tsx index 51f9473833a..b2018191e80 100644 --- a/packages/react-aria-components/stories/Select.stories.tsx +++ b/packages/react-aria-components/stories/Select.stories.tsx @@ -64,7 +64,11 @@ export const SelectRenderProps = () => ( ); -let manyItems = [...Array(100)].map((_, i) => ({id: i, name: `Item ${i}`})); +let makeItems = (length: number) => Array.from({length}, (_, i) => ({ + id: i, + name: `Item ${i}` +})); +let manyItems = makeItems(100); export const SelectManyItems = () => ( + + + + + {item => {item.name}} + + + + + +);