Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Bug]: Рассинхрон в CustomSelect #8334

Closed
vamid opened this issue Mar 7, 2025 · 1 comment · Fixed by #8365
Closed

[Bug]: Рассинхрон в CustomSelect #8334

vamid opened this issue Mar 7, 2025 · 1 comment · Fixed by #8365

Comments

@vamid
Copy link

vamid commented Mar 7, 2025

Описание

При переходе на createRoot реакт стал успевать отрисовывать состояние компонента, когда options переданы новые (и они есть), а отрисовывается (на 1 мс) так будто их нет.

Возможно это из-за того, что renderDropdown обернут в useMemo, который не зависит от пропа options напрямую. (Зависит от одноименного стейта, который обновляется позже). Получаем ситуацию, когда список новый в компоненте есть, а рендер происходит со старыми данными.

2025-03-06.17.41.01.mov

Версия

7.0.0

В каких браузерах воспроизводится проблема?

Chrome

Шаги воспроизведения

No response

Ожидаемое поведение

No response

Скриншоты

No response

Пример с воспроизведением

https://codesandbox.io/p/sandbox/currying-leaf-7pql32?file=%2Fsrc%2FApp.js%3A10%2C37

@vamid vamid added the type:bug label Mar 7, 2025
@github-project-automation github-project-automation bot moved this to 🗃 Backlog in VKUI Mar 7, 2025
@andrey-medvedev-vk andrey-medvedev-vk added this to the v7.2.0 milestone Mar 7, 2025
@andrey-medvedev-vk andrey-medvedev-vk self-assigned this Mar 7, 2025
@andrey-medvedev-vk andrey-medvedev-vk moved this from 🗃 Backlog to 🔜 To do in VKUI Mar 7, 2025
@andrey-medvedev-vk andrey-medvedev-vk moved this from 🔜 To do to 🔧 In progress in VKUI Mar 10, 2025
@andrey-medvedev-vk andrey-medvedev-vk moved this from 🔧 In progress to 👀 In Review in VKUI Mar 14, 2025
andrey-medvedev-vk added a commit that referenced this issue Mar 26, 2025
…ation (#8365)

В #8334 видно, что при асинхронной загрузке опций есть лаг между тем когда `fetching` уже не `true`, но опций ещё нет и мы в дропдауне, вместо лоадера, выводим `Ничего не найдено`.
Опций нет по той причине, что рендерим мы опции из локального стейта, который мы синхронизируем с props.options, а синхронизируем мы через `useEffect`. 
Получается, что должен сработать `useEffect` прежде чем новые, загруженные опции пользователя, переданные через `props.options`, попадут в рендер дропдауна.

- Убран локальный стейт `options`, вместо этого `options` это результат фильтрации `props.options`, обёрнутой в `useMemo`.
- Изменилась логика проверки необходимости вызова `onChange` при клике на опцию из списка.
Раньше она была основана на проверке по индексам опций в списке, типа `selectedOptionIndex`, индекс брался из`options`, отфильтрованной версии `props.options`.
Теперь такая логика не работает для принятия решения по вызову `props.onChange`, потому что `options` фильтруются быстрее, а значит ссылаться на опцию по индексу опасно, индекс опции уже может поменяться между кликом по опции и моментом, когда мы начнём принимать решение о вызове `onChange`.
Переехали на проверку по значению `nativeSelectValue`/`prevNativeSelectValue`, а не по индексу.

Исправлена ошибка, что при повторном поиске ранее выбранной опции она на некоторое время подсвечивается и потом сбрасывается.
Шаги для воспроизведения.
- Выбрать опцию из списка,
- Переместить мышку на инпут
- Открыть дропдуан с клавиатуры (в примере выше путём ввода текста)
- Появится список и выбранная опция будет в фокусе, а потом фокус пропадёт.

Связано с тем, что когда у нас мышка на инпуте, то после открытия дропдауна тригерится событие onMouseLeave причём target у него это та самая опция, бывшая в фокусе, а relatedTarget (target на который курсор перешёл) это инпут. А на onMouseLeave у нас завязана логика подсветки элемента в фокусе (программный ховер).

Поправилено, с помощью проверки, что мышка не двигалась в момент события onMouseLeave.
@github-project-automation github-project-automation bot moved this from 👀 In Review to ✅ Done in VKUI Mar 26, 2025
@vkcom-publisher
Copy link
Contributor

v7.2.0 🎉

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
Status: ✅ Done
Development

Successfully merging a pull request may close this issue.

3 participants