Сосредоточить дочерний компонент на монтаже

Я хочу создать контролируемое меню. Если focused Индекс передается, меню должно автоматически фокусировать соответствующую опцию при монтировании. Для этого я реализовал следующее.

export default class Option extends Component {
  componentDidMount() {
    // The focus appears only on calling force update
    // this.forceUpdate();
  }

  render() {
    // focus the second option
    return (
      <div className="menu">
        {props.options.map((o, index) => (
          <Option focused={index === 1}>{o.label}</Option>
        ))}
      </div>
    );
  }
}

export default class Option extends PureComponent {
  constructor(props) {
    super(props);

    this.optionRef = React.createRef();
  }

  componentDidMount() {
    if (this.props.focused) {
      this.optionRef.current.focus();
    }
  }

  componentDidUpdate(prevProps) {
    if (this.props.focused) {
      this.optionRef.current.focus();
    }
  }

  render() {
    return (
      <div
        tabIndex={-1}
        ref={this.optionRef}
        onClick={this.props.onClick}
      >
        {this.props.children}
      </div>
    );
  }
}

Однако опция не фокусируется на монтировании. Я вынужден обновить меню, чтобы вызвать componentDidUpdate, что заставляет опцию быть сосредоточенным. Есть ли более чистый способ обойти это (кроме размещения всех ссылок в компоненте меню)?

0 ответов

Другие вопросы по тегам