【问题标题】:How can I focus on a react-select component at will?如何随意关注 react-select 组件?
【发布时间】:2019-03-23 03:46:54
【问题描述】:

使用 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}
      />
    );
  }

这就是我称之为包装器的地方:

        <Wrapper
          options={this.props.labelOptions}
          ref={this.wrapperRef}
        />

然后我尝试使用this.dropdownNode.focus() 或this.dropdownNode.current.focus() 调用焦点,两者都说找不到焦点方法。

【问题讨论】:

  • react-select 在它的 ref 上有一个焦点功能,你能告诉我们你是如何尝试的吗?
  • @BoyWithSilverWings 啊在这种情况下可能是因为我在它上面实现了一个包装器组件。所以我需要暴露焦点功能。如果它不起作用,我会尝试然后发布代码。
  • 看起来 react-select autoFocus 属性正在 inputRef 上调用 .focus(),如下所示:github.com/JedWatson/react-select/blob/master/src/…

标签: reactjs react-select


【解决方案1】:

因为您正在包装 Select 组件,所以您不能从您提供给包装器的 ref 中调用 Select 的 .focus() 函数。由于ref 是一种特殊的道具,该包装器的引用仅引用Wrapper 本身,不是它包装的组件(选择)。

要访问实际的 Select 组件的 ref,您必须将 ref 作为具有不同的非魔法名称的 prop 向下传递给它,例如 innerRef(react-select 代码实际上给出了一个很好的例子因为它正在访问实际的输入元素和focusing on that)。

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

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

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

        <Wrapper
          options={this.props.labelOptions}
          innerRef={this.selectRef}
        />

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

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

【讨论】:

  • 我正在使用 React-select v2.4.4。对我有用的是this.selectRef.focus()。也许有一天它会对某人有用。
  • 您好,您有codeandbox 示例吗?我也面临同样的问题。
猜你喜欢
  • 2021-12-29
  • 2018-08-26
  • 2017-08-27
  • 2022-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-27
相关资源
最近更新 更多