[BUG] dcc.Dropdown: virtualized list keeps the height measured at opening when options grow while the menu is open
Les mainteneurs répondent en général sous 1 jour
@KoolADE85 y travaille déjà.
Depuis le 9/11/2026.
Évaluation
Cette issue n'a pas encore été évaluée.
Description
Describe your context
dash 4.5.0
Reproduced in headless Chromium (Playwright); first seen by our users on dash 4.4.1.
Describe the bug
A multi dcc.Dropdown whose options are updated by a callback while its menu is open keeps the list height it measured when the menu opened. If the menu opens while the options are few (here 1) and the callback then brings back many (here 300), the virtualized list stays one row tall (34 px) and the user has to scroll inside a single row. Closing and opening the menu again shows it at the normal height.
This happens with cascading filters: an item is chosen, the callback narrows the options to it, the user clears it with the × and opens the menu again before the callback has returned all the options.
The cause seems to be in OptionsList (components/dash-core-components/src/utils/optionRendering.tsx): the container is measured once, in a useLayoutEffect with an empty dependency array, and listHeight = Math.min(measuredHeight, options.length * defaultOptionHeight). With one option the measured height is one row, and it is never measured again when options grows.
Minimal example
import time
from dash import Dash, Input, Output, dcc, html
ALL = [f"item-{i:03d}" for i in range(300)]
app = Dash(__name__)
app.layout = html.Div(
[dcc.Dropdown(id="dd", options=ALL, multi=True, placeholder="Pick an item")],
style={"width": 400, "padding": 40},
)
@app.callback(Output("dd", "options"), Input("dd", "value"))
def narrow(value):
# like a cascading filter: once an item is chosen only it is offered;
# cleared, all 300 come back (the server takes a moment)
time.sleep(0.5)
return value if value else ALL
if __name__ == "__main__":
app.run(port=8077, debug=False)
Steps:
- open the menu, pick
item-007, close the menu (the options become["item-007"]); - click the × (Clear selection) and open the menu at once, before the callback returns;
- wait for the 300 options to come back.
Measured with Playwright on .dash-dropdown-content .dash-options-list-virtualized:
| State | list height | content height |
|---|---|---|
| menu opened with 300 options | 124 px | 10494 px |
| step 3: menu opened with 1 option, 300 options back | 34 px | 10500 px |
| menu closed and opened again | 124 px | 10494 px |
Expected behavior
The list height follows the options: when options changes while the menu is open, the list is measured again (for example the layout effect depending on options.length, or measuredHeight reset when the options change), so 300 options show at the normal height without closing and reopening the menu.
We work around it client-side by closing and reopening a menu whose virtualized list is shorter than three rows while its content is taller, which is what users did by hand.
- Langage dominant
- Python
- Étoiles
- 24.5k
- Forks
- 2.3k
- Merge moyen
- 3 j 7 h
- PR mergées (30 j)
- 30
Préparer son environnement
- Aucun Dockerfile ni fichier Docker Compose
- Propose un modèle de pull request
- Lire le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de plotly/dash
-
P2 plotly-internal size: 1 task
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
Les mainteneurs répondent en général sous 1 jour
-
Extract graph schema validation into properly named testPeut-être pris @Nice6042 l’a pris il y a 90 jours. Ouvertegood first issue P3 size: 1 task
Difficulté 2/5 1-3 heures Accessibilité débutants 68/100
plotly/dash#3735 · 3 commentaires ·
Les mainteneurs répondent en général sous 1 jour
-
[BUG] Patch.update mutates a shared mapping and rewrites earlier mergesPeut-être pris @peterolkhov l’a pris aujourd’hui. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 35/100
Les mainteneurs répondent en général sous 1 jour
-
[BUG] `set_props` streamingPeut-être pris @BSd3v l’a pris il y a 5 jours. Ouvertebug P3 size: 1
Difficulté 4/5 3-5 jours Accessibilité débutants 35/100
plotly/dash#4127 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
-
[BUG] dcc.Upload contents and dcc.Geolocation position docstrings describe the wrong value formatPeut-être pris @ZainnQureshii l’a pris il y a 5 jours. Ouvertebug P3 size: 1
Difficulté 1/5 Moins d'une heure Accessibilité débutants 30/100
Les mainteneurs répondent en général sous 1 jour
Toutes les issues de plotly/dash
Issues similaires
-
[BUG] HTTP lifecycle dispatch treats a NO_PROXY-only environment as corporate egress and skips the resolve-and-pinned sessionPeut-être pris @bodapatisaikrishna l’a pris aujourd’hui. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 76/100
Les mainteneurs répondent en général sous 1 jour
-
[integration]: NoMacSandboxOuverteexternal
Difficulté 2/5 1-3 heures Accessibilité débutants 65/100
langchain-ai/docs#7652 ·
Les mainteneurs répondent en général sous 1 jour
-
[oblt-aw][autodoc] Document new e2e-secret-leak-artifacts workflow and update e2e-all leaf listOuverte
Difficulté 2/5 1-3 heures Accessibilité débutants 79/100
elastic/oblt-aw#2513 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
-
bug p2
Difficulté 2/5 1-3 heures Accessibilité débutants 85/100
amd/gaia#7326 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
-
enhancement
Difficulté 1/5 Moins d'une heure Accessibilité débutants 75/100
NCAR/CLM-Tutorial#113 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour