diff --git a/packages/@headlessui-react/src/components/combobox/combobox.tsx b/packages/@headlessui-react/src/components/combobox/combobox.tsx index aa8d757f3b..00011bdd8a 100644 --- a/packages/@headlessui-react/src/components/combobox/combobox.tsx +++ b/packages/@headlessui-react/src/components/combobox/combobox.tsx @@ -1646,17 +1646,35 @@ function OptionsFn( }) } + // Frozen state, the selected value will only update visually when the user re-opens the + let [frozenValue, setFrozenValue] = useState(data.value) + if ( + data.value !== frozenValue && + data.comboboxState === ComboboxState.Open && + data.mode !== ValueMode.Multi + ) { + setFrozenValue(data.value) + } + + let isSelected = useEvent((compareValue: unknown) => { + return data.compare(frozenValue, compareValue) + }) + return ( - {render({ - ourProps, - theirProps, - slot, - defaultTag: DEFAULT_OPTIONS_TAG, - features: OptionsRenderFeatures, - visible, - name: 'Combobox.Options', - })} + + {render({ + ourProps, + theirProps, + slot, + defaultTag: DEFAULT_OPTIONS_TAG, + features: OptionsRenderFeatures, + visible, + name: 'Combobox.Options', + })} + ) } @@ -1796,7 +1814,7 @@ function OptionFn< } if (data.mode === ValueMode.Single) { - requestAnimationFrame(() => actions.closeCombobox()) + actions.closeCombobox() } })