[BUG] dcc.Dropdown: virtualized list keeps the height measured at opening when options grow while the menu is open
維護者通常 1 天內回覆
@KoolADE85 已經在處理了。
開始於 2026年11月9日。
評估
這個 Issue 還沒有評估資料。
描述
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.
- 主要語言
- Python
- 星號
- 24.5k
- 分支
- 2.3k
- 平均合併
- 3 天 7 小時
- 30 天內合併 PR
- 30
環境準備
- 沒有 Dockerfile 或 Docker Compose 檔案
- 有 Pull Request 範本
- 閱讀貢獻指南
從這裡開始
- 先讀完整個 Issue,再讀專案的貢獻指南。
- 在 Issue 下留言說明你要接手 —— 這能避免兩個人做同樣的事。
- Fork 儲存庫,在一個分支上完成修改。
- 送出 Pull Request,並在描述裡引用這個 Issue 編號。
plotly/dash 的其他 Issue
-
P2 plotly-internal size: 1 task
難度 2/5 1-3 小時 新手友好度 78/100
維護者通常 1 天內回覆
-
Extract graph schema validation into properly named test可能已有人在做 @Nice6042 於 90 天前認領。 未關閉good first issue P3 size: 1 task
難度 2/5 1-3 小時 新手友好度 68/100
維護者通常 1 天內回覆
-
[BUG] Patch.update mutates a shared mapping and rewrites earlier merges可能已有人在做 @peterolkhov 今天認領。 未關閉
難度 2/5 1-3 小時 新手友好度 35/100
維護者通常 1 天內回覆
-
[BUG] `set_props` streaming可能已有人在做 @BSd3v 於 5 天前認領。 未關閉bug P3 size: 1
難度 4/5 3-5 天 新手友好度 35/100
維護者通常 1 天內回覆
-
[BUG] dcc.Upload contents and dcc.Geolocation position docstrings describe the wrong value format可能已有人在做 @ZainnQureshii 於 5 天前認領。 未關閉bug P3 size: 1
難度 1/5 1 小時以內 新手友好度 30/100
維護者通常 1 天內回覆
相似的 Issue
-
[BUG] HTTP lifecycle dispatch treats a NO_PROXY-only environment as corporate egress and skips the resolve-and-pinned session可能已有人在做 @bodapatisaikrishna 今天認領。 未關閉
難度 2/5 1-3 小時 新手友好度 76/100
維護者通常 1 天內回覆
-
external
難度 2/5 1-3 小時 新手友好度 65/100
langchain-ai/docs#7652 ·
維護者通常 1 天內回覆
-
難度 2/5 1-3 小時 新手友好度 79/100
elastic/oblt-aw#2513 · 1 則留言 ·
維護者通常 1 天內回覆
-
bug p2
難度 2/5 1-3 小時 新手友好度 85/100
維護者通常 1 天內回覆
-
enhancement
難度 1/5 1 小時以內 新手友好度 75/100
NCAR/CLM-Tutorial#113 · 1 則留言 ·
維護者通常 1 天內回覆