Dashboard dropdown pickers re-render on every animation frame while open
I maintainer di solito rispondono entro 1 giorno
Valutazione
- Difficoltà
- 1/5
- Tempo stimato
- 1-3 ore
- Idoneità per principianti
- 35/100
- Tipo di issue
- Bug
- Chiarezza
- Specificata chiaramente
- Stato di attività
- Ferma
- Stack tecnologico
- react, typescript
- Ambito
- frontend
Direzione di ricerca
The affected pickers are in ui/combobox.tsx, ui/combobox-events.tsx, and ui/combobox-advanced.tsx; the dependency is pinned in apps/start/package.json. Read the reported rc-virtual-list height collection behavior and compare the pinned version with the upstream fix. Done means idle open pickers stop rendering every frame; an open pull request already tracks this work.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Describe the bug
While any searchable dropdown picker in the dashboard is open, its list re-renders on every animation frame, for as long as it stays open. Nothing has to change for this to happen: no hover, no scroll, no data loading. It stops when the popover closes and starts again the next time it opens.
It's invisible in normal use, but it keeps the main thread busy (a React commit plus a forced layout read per frame) the whole time someone is building a report or a filter.
Steps to reproduce
- Open React DevTools → Settings → enable Highlight updates when components render.
- Open any report and click the event picker in the sidebar (or the Criteria / Unit picker in a retention report, or a filter's value picker).
- Keep the mouse still.
The open list keeps flashing. The update counter on List, Filler and the item components climbs by ~60/s on a 60 Hz display (~120/s on a 120 Hz one), indefinitely.
Expected: the list renders when it opens, scrolls or its items change, and is idle otherwise.
Where it shows up
Every picker built on rc-virtual-list with cmdk items:
ui/combobox.tsx(Combobox): report criteria/unit, the funnel breakdown "From step" picker, Yes/No filter values, overview filters, plus pickers in notification rules, the webhook integration, tracking and organization settings, and onboardingui/combobox-events.tsx(ComboboxEvents): event pickers in report series, fixed events, filters, custom events, events stats, project event filtersui/combobox-advanced.tsx(ComboboxAdvanced): filter values, cohort criteria builder, cohort filters, overview filter buttons, project access grants
PropertiesCombobox (the property/breakdown picker) also uses rc-virtual-list, but its items are motion.divs with a stable ref, and it doesn't loop.
Cause
It's two library behaviours feeding each other:
- rc-virtual-list 3.14.5: every time an item's ref is attached,
useHeightscallscollectHeight(), and that always doessetUpdatedMark(c => c + 1)on the next frame, whether or not a height changed (hooks/useHeights.js). - cmdk:
Command.Itemrenders its<div>withref={mergeRefs([ref, forwardedRef])}, which is a new callback ref on every render. React detaches and re-attaches it on every commit. cmdk 1.x does the same withcomposeRefs.
So each list render attaches a new ref, which schedules a height collection, which re-renders the list on the next frame. And so on.
This was fixed upstream in rc-virtual-list 3.17.1 (react-component/virtual-list#299, "fix: trigger only when changed"): the counter only moves when a measured height actually changes. apps/start/package.json still pins 3.14.5, unchanged since the virtual list was added in 01ed4acc.
Measurements
The dashboard's real Combobox / ComboboxAdvanced components, React 19.2.3, cmdk 0.2.1, production build, headless Chrome at 60 Hz. React commits counted with <Profiler> over 5 s with the popover open and idle:
| Picker | rc-virtual-list 3.14.5 | rc-virtual-list 3.19.2 |
|---|---|---|
Combobox (3 items) |
300 commits / 301 frames | 0 |
ComboboxAdvanced (3 items) |
300 / 301 | 0 |
Combobox (1,000 items, searchable) |
301 / 301 | 1 |
Suggested fix
Bump rc-virtual-list to 3.17.1 or later (3.19.2 is the latest; avoid 3.17.0, which has the hang reported in ant-design/ant-design#52400). Its dependencies and the props the dashboard uses are unchanged. I'll open a PR.
Environment
- OpenPanel
main@ 6521604 (also seen on our self-hosted instance) - React 19.2.3, cmdk 0.2.1, rc-virtual-list 3.14.5
- Chrome on macOS
- Lingua principale
- TypeScript
- Stelle
- 7.2k
- Fork
- 531
- Merge medio
- 23h 58m
- PR unite (30g)
- 51
Preparare l'ambiente
- Include un Dockerfile o un file Docker Compose
- Nessun modello di pull request
- Nessuna guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di Openpanel-dev/openpanel
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 73/100
Openpanel-dev/openpanel#610 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
ClickHouse retry logs print CLICKHOUSE_URL with its passwordForse già presa @ppjsw l’ha presa 10 giorni fa. Aperta
Difficoltà 1/5 1-3 ore Idoneità per principianti 92/100
Openpanel-dev/openpanel#551 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
login page needs refinementForse di nuovo libera Una pull request per questa issue è stata chiusa senza essere unita. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
Openpanel-dev/openpanel#495 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 5/5 Più di una settimana Idoneità per principianti 20/100
Openpanel-dev/openpanel#615 ·
I maintainer di solito rispondono entro 1 giorno
-
Session-grouped queries treat every sessionless event as one session (wrong results, ClickHouse OOM)Forse già presa @grootbro l’ha presa 6 giorni fa. Aperta
Difficoltà 4/5 3-5 giorni Idoneità per principianti 52/100
Openpanel-dev/openpanel#575 ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di Openpanel-dev/openpanel
Issue simili
-
bug
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 86/100
awslabs/visual-asset-management-system#937 ·
I maintainer di solito rispondono entro 1 giorno
-
t0ggles
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 82/100
nolimits4web/swiper#8255 · 1 commento ·
I maintainer di solito rispondono entro 15 giorni
-
render: --variables-file (and --variables <path>) fails with "io.readFile is not a function" since 0.8.212Forse già presa @miguel-heygen l’ha presa oggi. Apertabug triage/needs-triage
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
heygen-com/hyperframes#6830 ·
I maintainer di solito rispondono entro 1 giorno
-
bug launch local use
Difficoltà 2/5 1-3 ore Idoneità per principianti 65/100
I maintainer di solito rispondono entro 1 giorno
-
account: profile bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
I maintainer di solito rispondono entro 5 giorni