如何随意专注于 react-select 组件?

Bra*_*ing 13 reactjs react-select

使用 react-select v2,我想在用户点击某个键时显示并关注 Select 元素。以下是我尝试过的一些事情或我走下的道路。

当我为 Select 元素设置 ref 并尝试调用.focus它时,它说找不到焦点函数。也许我应该以某种方式获取它的子元素,然后将注意力集中在它上面?

似乎没有任何我可以传递的道具会触发焦点功能。有一个openOnFocus但不是一个focusOnOpen。我唯一能想到的就是启用自动对焦,然后以某种方式触发重新安装,但似乎没有一种简单的方法可以做到这一点,而且感觉很糟糕。或者,我可以启用每次按下键时只创建 Select 组件而不是显示它,然后卸载它而不是隐藏它。

我怎样才能在我想要的时候正确地让 react-select 元素获得焦点?

我在我的组件周围使用了一个包装组件。这是我的包装器的渲染方法:

  render() {
    return (
      <Select
        options={this.props.options}
        value={this.state.value}
        ref={this.selectRef}
      />
    );
  }
Run Code Online (Sandbox Code Playgroud)

这就是我调用包装器的地方:

        <Wrapper
          options={this.props.labelOptions}
          ref={this.wrapperRef}
        />
Run Code Online (Sandbox Code Playgroud)

然后我尝试使用其中之一this.dropdownNode.focus()this.dropdownNode.current.focus()两者调用 focus并且都说没有找到 focus 方法。

Bra*_*ing 7

因为您正在包装Select组件,所以您无法.focus()从提供给包装器的引用中调用 Select 的函数。由于ref是一种特殊类型的 prop,因此该包装器的 ref 仅引用Wrapper其自身,而不是它包装的组件(Select)。

要访问实际Select组件的引用,您必须将引用作为具有不同的非魔术名称的 prop 传递给它,例如innerRef(react-select 代码实际上给出了一个很好的示例,因为它正在访问实际的输入元素并聚焦在那)。

这是修复它的更改。这是实际使用 Select 的包装器组件(并且它接收传递给它的引用):

  render() {
    return (
      <Select
        options={this.props.options}
        value={this.state.value}
        ref={this.props.innerRef}
      />
    );
  }
Run Code Online (Sandbox Code Playgroud)

这是调用该包装器的组件。在构造函数中,我创建了 ref,this.selectRef = React.createRef()然后将其作为此渲染方法中的 prop 传入:

        <Wrapper
          options={this.props.labelOptions}
          innerRef={this.selectRef}
        />
Run Code Online (Sandbox Code Playgroud)

Select然后我可以通过this.selectRef.current.focus()在任何我想要的地方运行来调用组件本身的焦点。

注:感谢BoyWithSilverWings的回答。这个问题与 React 16.3 有关。还有一种新React.ForwardRefs方法,但这种方法对我来说似乎更简单。

  • 我正在使用 React-select v2.4.4。对我有用的是“this.selectRef.focus()”。也许有一天它会对某人有用。 (2认同)