Как использовать асинхронный источник данных для компонента Blueprintjs Select? - PullRequest
1 голос
/ 19 мая 2019

Официальный способ фильтрации элементов - обработчик событий itemListPredicate. Здесь задокументировано:

https://blueprintjs.com/docs/#select/select-component.querying

Проблема в том, что itemListPredicate имеет эту подпись:

export declare type ItemListPredicate<T> = (query: string, items: T[]) => T[];

Как вы видите, он ожидает отфильтровать некоторые элементы из фиксированного списка уже существующих элементов в одно мгновение. Это не может быть использовано для больших наборов данных. Мне нужно отправить запрос на сервер, дождаться ответа и затем вернуть (возможно, новые) элементы. Но этого нельзя сделать с помощью описанного выше обработчика, поскольку он не асинхронный.

Я попытался сделать обходной путь:

* сохранить измененный запрос в локальном состоянии при вызове itemListPredicate * отправьте запрос на сервер из аннулированного асинхронного метода и дождитесь ответа * измените свойство items компонента Select после того, как сервер вернет ответ

Но это тоже не работает. Изменение свойства items автоматически закроет Popover, поэтому его нельзя использовать для поиска в реальном времени.

Я также мог бы использовать для этого другой компонент (например, React-Select), но я бы хотел использовать решение с blueprintjs Select - просто потому, что оно является частью библиотеки blueprintjs и легко интегрируется с ней. (Например, размеры, темы, значки, намерения и т. Д.)

Как это сделать правильно?

ОБНОВЛЕНИЕ : Я узнал, что был неправ. Установка реквизита предметов не закроет Popover. Я случайно установил что-то еще, что вызвало повторную визуализацию всего Select. Так что моя идея РАБОТАЕТ. Я не собираюсь удалять этот пост, потому что это может понадобиться кому-то другому. Я собираюсь опубликовать все решение чуть позже (после тестирования).

...