如何随意关注一个 react-select 组件?
How can I focus on a react-select component at will?
使用 react-select v2,我想在用户按下某个键时显示并关注 Select 元素。以下是我尝试过的一些事情或我走过的路。
当我为 Select 元素设置 ref 并尝试对其调用 .focus
时,它说找不到焦点函数。也许我应该以某种方式获取它的子元素,然后调用 focus on that?
似乎没有任何我可以通过的道具会触发焦点功能。有 openOnFocus
但没有 focusOnOpen
。我唯一能想到的就是启用 autoFocus,然后以某种方式触发重新安装,但似乎没有一种简单的方法可以做到这一点,而且感觉很麻烦。或者,我可以启用每次按下键时只创建 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()
调用焦点,但都说找不到焦点方法。
因为您正在包装 Select
组件,所以您不能从您提供给包装器的 ref 调用 Select 的 .focus()
函数。由于 ref
是一种特殊的道具,该包装器的 ref 仅指 Wrapper
本身, 而不是 它包装的组件(Select ).
要访问实际的 Select
组件的引用,您必须将引用作为具有不同的非魔术名称的道具传递给它,例如 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()
创建 ref,然后我将其作为 prop 传入此渲染方法:
<Wrapper
options={this.props.labelOptions}
innerRef={this.selectRef}
/>
然后我可以通过 运行 this.selectRef.current.focus()
在我想要的任何地方调用对 Select
组件本身的关注。
备注: 感谢 BoyWithSilverWings 的回答。这个问题与 React 16.3 有关。还有一个新的 React.ForwardRefs
方法,但这种方法对我来说似乎更简单。
使用 react-select v2,我想在用户按下某个键时显示并关注 Select 元素。以下是我尝试过的一些事情或我走过的路。
当我为 Select 元素设置 ref 并尝试对其调用 .focus
时,它说找不到焦点函数。也许我应该以某种方式获取它的子元素,然后调用 focus on that?
似乎没有任何我可以通过的道具会触发焦点功能。有 openOnFocus
但没有 focusOnOpen
。我唯一能想到的就是启用 autoFocus,然后以某种方式触发重新安装,但似乎没有一种简单的方法可以做到这一点,而且感觉很麻烦。或者,我可以启用每次按下键时只创建 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()
调用焦点,但都说找不到焦点方法。
因为您正在包装 Select
组件,所以您不能从您提供给包装器的 ref 调用 Select 的 .focus()
函数。由于 ref
是一种特殊的道具,该包装器的 ref 仅指 Wrapper
本身, 而不是 它包装的组件(Select ).
要访问实际的 Select
组件的引用,您必须将引用作为具有不同的非魔术名称的道具传递给它,例如 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()
创建 ref,然后我将其作为 prop 传入此渲染方法:
<Wrapper
options={this.props.labelOptions}
innerRef={this.selectRef}
/>
然后我可以通过 运行 this.selectRef.current.focus()
在我想要的任何地方调用对 Select
组件本身的关注。
备注: 感谢 BoyWithSilverWings 的回答。这个问题与 React 16.3 有关。还有一个新的 React.ForwardRefs
方法,但这种方法对我来说似乎更简单。