过滤项目的官方方法是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 库的一部分并与它无缝集成。(例如尺寸、主题、图标、意图等)
如何正确执行此操作?
更新:我发现我错了。设置 items 属性不会关闭 Popover。我不小心设置了导致重新渲染整个 Select 的其他内容。所以我的想法确实有效。我不会删除这篇文章,因为其他人可能需要它。我将稍后(测试后)发布整个解决方案。