material-ui: внутренний фокус SelectField для MenuItem

Я внедряю SelectField с около 30 вариантами в мобильное приложение. Все отлично работает, однако он используется для быстрого ввода данных. Прямо сейчас я ограничен показом первых 10 или около того элементов из-за размера экрана мобильного телефона.

В выпадающем фокусе я бы хотел сосредоточиться на среднем (15-м или около того) элементе MenuItem, потому что большинство выбранных элементов находятся примерно посередине списка. Без этого пользователь должен нажимать и прокручивать каждый раз в раскрывающемся списке для каждой записи данных.

Есть ли способ сделать это легко?

1 ответ

Я не думаю, что есть простой способ сделать это, но это можно сделать. Вы можете установить пустой <MenuItem/> в поле выбора в середине списка выбора, на котором вы хотели бы сосредоточиться, когда ваше приложение используется на мобильных устройствах. Пустой <MenuItem/> не будет отображаться в списке.

Вы бы тогда использовали onFocus свойство установить состояние на значение вашего пустого <MenuItem/> когда <SelectField/> получает фокус. Это сделает поле выбора открытым для места в вашем списке, где пустое <MenuItem/> является.

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

Мы можем использовать этот базовый пример для демонстрации (использует функции жирной стрелки es6 и модифицировано из документации MaterialUI).

  constructor(props) {
    super(props);
    this.state = {value: null};
  }

  handleChange = (event, index, value) => this.setState({value});

  handleFocus = () => {
     if(//Do checks for screen size here, if mobile){
        this.setState({value: 9999});
     }     
  }

  render() {
     const items = [
         <MenuItem value={0} primaryText='1'/>
         <MenuItem value={1} primaryText='2'/>
         <MenuItem value={2} primaryText='3'/>
         <MenuItem value={9999} />
         <MenuItem value={3} primaryText='4'/>
         <MenuItem value={4} primaryText='5'/>
    ];

    return (
      <SelectField maxHeight={300} value={this.state.value} onChange={this.handleChange} onFocus={() => this.handleFocus()}>
        {items}
      </SelectField>
    );
  }
}
Другие вопросы по тегам