Предложения Джордана, приведенные выше, плюс небольшой эксперимент, в конечном итоге дали работоспособный ответ:
- Установите для
filterable
значение false, чтобы скрыть вход встроенного фильтра.
- Используйте
itemListRenderer
для визуализации не только выпадающих элементов, но и группы входных данных, служащей фильтром замены.
- Используйте опцию InputGroup
inputRef
для захвата ссылки на базовый ввод HTML. Используйте это, чтобы сфокусировать ввод, когда он появляется, через свойство onOpening
в Select popoverProps
prop.
Вот простой компонент, реализующий описанное выше:
// Extends Blueprint's Select component with header and footer props that
// can be any arbitrary elements or components
class ExtendedSelect extends Component {
constructor(props) {
super(props);
this.inputRef = null;
this.state = {query: ""};
}
handleInputChanged = event => {
this.setState({query: event.target.value});
}
receiveInputRef = (ref) => {
this.inputRef = ref;
}
handlePopoverOpening = () => {
if (this.inputRef) {
this.inputRef.focus();
}
}
listRenderer = ({filteredItems, renderItem}) => {
// Apply the supplied item renderer to the filtered list of items
const renderedItems = filteredItems.map(renderItem);
return (
<div>
{this.props.header}
<InputGroup inputRef={this.receiveInputRef} value={this.state.query} onChange={this.handleInputChanged} leftIcon="search" />
<Menu>
{renderedItems}
</Menu>
{this.props.footer}
</div>
);
}
render() {
return (
<Select
items={this.props.items}
filterable={false}
query={this.state.query}
itemListRenderer={this.listRenderer}
itemPredicate={this.props.itemPredicate}
itemRenderer={this.props.itemRenderer}
popoverProps={{onOpening:this.handlePopoverOpening}}
onItemSelect={this.props.onItemSelect}
>
{this.props.children}
</Select>
);
}
}
(Обратите внимание, что я передаю только некоторые реквизиты Select в пользовательский компонент - я подозреваю, что знал бы способ передать их все, если бы я был более опытным разработчиком React.)
Это работает на удивление хорошо - например, кроме небольшой работы по фокусировке ввода, когда он появляется, все другие встроенные функции Select работают, как и ожидалось, как клавиатурная навигация в меню, когда ввод фокусируется.