From 50a08dd8008b0383ba8daec9371df01107fe8b4d Mon Sep 17 00:00:00 2001
From: Raashish Aggarwal <94279692+raashish1601@users.noreply.github.com>
Date: Sat, 2 May 2026 09:57:39 +0530
Subject: [PATCH] Fix unmatched select size value handling
---
.../src/client/ReactDOMSelect.js | 4 +-
.../src/__tests__/ReactDOMSelect-test.js | 39 +++++++++++++++++++
2 files changed, 42 insertions(+), 1 deletion(-)
diff --git a/packages/react-dom-bindings/src/client/ReactDOMSelect.js b/packages/react-dom-bindings/src/client/ReactDOMSelect.js
index 00136aa8175b..06ead2834c05 100644
--- a/packages/react-dom-bindings/src/client/ReactDOMSelect.js
+++ b/packages/react-dom-bindings/src/client/ReactDOMSelect.js
@@ -101,8 +101,10 @@ function updateOptions(
defaultSelected = options[i];
}
}
- if (defaultSelected !== null) {
+ if (defaultSelected !== null && node.size <= 1) {
defaultSelected.selected = true;
+ } else if (node.size > 1) {
+ node.selectedIndex = -1;
}
}
}
diff --git a/packages/react-dom/src/__tests__/ReactDOMSelect-test.js b/packages/react-dom/src/__tests__/ReactDOMSelect-test.js
index c90455307d0f..ba11b673ca42 100644
--- a/packages/react-dom/src/__tests__/ReactDOMSelect-test.js
+++ b/packages/react-dom/src/__tests__/ReactDOMSelect-test.js
@@ -486,6 +486,45 @@ describe('ReactDOMSelect', () => {
expect(select.selectedIndex).toBe(-1);
});
+ it('does not select an item when size is greater than 1 and value does not match', async () => {
+ const stub = (
+
+ );
+ const options = stub.props.children;
+ const container = document.createElement('div');
+ const root = ReactDOMClient.createRoot(container);
+
+ await act(() => {
+ root.render(stub);
+ });
+
+ const select = container.firstChild;
+
+ expect(select.options[0].selected).toBe(false);
+ expect(select.options[1].selected).toBe(true);
+ expect(select.options[2].selected).toBe(false);
+ expect(select.value).toBe('giraffe');
+ expect(select.selectedIndex).toBe(1);
+
+ await act(() => {
+ root.render(
+ ,
+ );
+ });
+
+ expect(select.options[0].selected).toBe(false);
+ expect(select.options[1].selected).toBe(false);
+ expect(select.options[2].selected).toBe(false);
+ expect(select.value).toBe('');
+ expect(select.selectedIndex).toBe(-1);
+ });
+
it('should remember value when switching to uncontrolled', async () => {
const stub = (