react-select focus() 更改后不显示光标
react-select focus() doesn't show cursor after change
如 in the official documentation for react-select 所述,我正在尝试使用 ref 和 focus() 手动将焦点设置到控件输入字段中。在大多数情况下它有效,但不是在从下拉列表中选择一个选项后立即有效。
从下拉列表中选择一个选项后,控件获得焦点但未出现光标。它仅在您开始键入(包括按下 Esc 键)时出现。在随后打开菜单时,光标与整个控制字段的焦点一起出现。任何想法如何让这个工作?
我在 codesandbox.io here
中创建了示例代码
这是代码:
import React, { Component } from "react";
import ReactDOM from "react-dom";
import Select from "react-select";
import styled from "styled-components";
import { stateOptions } from "./data.js";
class PopoutExample extends Component {
selectRef = React.createRef();
state = {
isOpen: false,
option: undefined,
};
toggleOpen = () => {
const isOpening = !this.state.isOpen;
this.setState(
{
isOpen: isOpening,
},
() => isOpening && setTimeout(() => this.selectRef.focus(), 400),
);
};
onSelectChange = option => {
this.toggleOpen();
this.setState({ option });
};
render() {
const { isOpen, option } = this.state;
return (
<Dropdown
target={
<MainButton onClick={this.toggleOpen}>
{option ? option.label : "Select a State"}
</MainButton>
}
>
<Select
menuIsOpen
ref={ref => {
this.selectRef = ref;
}}
styles={{
container: provided => ({
...provided,
display: isOpen ? "block" : "none",
}),
}}
onChange={this.onSelectChange}
options={stateOptions}
value={option}
controlShouldRenderValue={false}
/>
</Dropdown>
);
}
}
const MainButton = styled.button`
padding: 10px;
background-color: aqua;
width: 100%;
`;
const Dropdown = ({ children, target }) => (
<div>
{target}
{children}
</div>
);
ReactDOM.render(<PopoutExample />, document.getElementById("root"));
如果我可以为您尝试实现的行为提供替代方案,而不是用 css 隐藏 Select
为什么不直接 mount
/ unmount
吗?
class PopoutExample extends Component {
state = {
isOpen: false,
option: undefined
};
toggleOpen = () => {
this.setState({
isOpen: !this.state.isOpen
});
};
onSelectChange = option => {
this.setState({ option, isOpen: !this.state.isOpen });
};
render() {
const { isOpen, option } = this.state;
return (
<Dropdown
target={
<MainButton onClick={this.toggleOpen}>
{option ? option.label : "Select a State"}
</MainButton>
}
>
{isOpen && (
<Select
autoFocus
menuIsOpen
onChange={this.onSelectChange}
options={stateOptions}
value={option}
controlShouldRenderValue={false}
/>
)}
</Dropdown>
);
}
}
这是我的解决方案 live example。
您可以注意到 official react-select examples 中也存在该错误。即使在选择后单击 blur
按钮也无法解决问题。
当用户 closes
菜单和 saves + automatically closes
操作时,代码可能略有不同。
我看到你在 github 上打开了一个 issue。让我们拭目以待。
如 in the official documentation for react-select 所述,我正在尝试使用 ref 和 focus() 手动将焦点设置到控件输入字段中。在大多数情况下它有效,但不是在从下拉列表中选择一个选项后立即有效。
从下拉列表中选择一个选项后,控件获得焦点但未出现光标。它仅在您开始键入(包括按下 Esc 键)时出现。在随后打开菜单时,光标与整个控制字段的焦点一起出现。任何想法如何让这个工作?
我在 codesandbox.io here
中创建了示例代码这是代码:
import React, { Component } from "react";
import ReactDOM from "react-dom";
import Select from "react-select";
import styled from "styled-components";
import { stateOptions } from "./data.js";
class PopoutExample extends Component {
selectRef = React.createRef();
state = {
isOpen: false,
option: undefined,
};
toggleOpen = () => {
const isOpening = !this.state.isOpen;
this.setState(
{
isOpen: isOpening,
},
() => isOpening && setTimeout(() => this.selectRef.focus(), 400),
);
};
onSelectChange = option => {
this.toggleOpen();
this.setState({ option });
};
render() {
const { isOpen, option } = this.state;
return (
<Dropdown
target={
<MainButton onClick={this.toggleOpen}>
{option ? option.label : "Select a State"}
</MainButton>
}
>
<Select
menuIsOpen
ref={ref => {
this.selectRef = ref;
}}
styles={{
container: provided => ({
...provided,
display: isOpen ? "block" : "none",
}),
}}
onChange={this.onSelectChange}
options={stateOptions}
value={option}
controlShouldRenderValue={false}
/>
</Dropdown>
);
}
}
const MainButton = styled.button`
padding: 10px;
background-color: aqua;
width: 100%;
`;
const Dropdown = ({ children, target }) => (
<div>
{target}
{children}
</div>
);
ReactDOM.render(<PopoutExample />, document.getElementById("root"));
如果我可以为您尝试实现的行为提供替代方案,而不是用 css 隐藏 Select
为什么不直接 mount
/ unmount
吗?
class PopoutExample extends Component {
state = {
isOpen: false,
option: undefined
};
toggleOpen = () => {
this.setState({
isOpen: !this.state.isOpen
});
};
onSelectChange = option => {
this.setState({ option, isOpen: !this.state.isOpen });
};
render() {
const { isOpen, option } = this.state;
return (
<Dropdown
target={
<MainButton onClick={this.toggleOpen}>
{option ? option.label : "Select a State"}
</MainButton>
}
>
{isOpen && (
<Select
autoFocus
menuIsOpen
onChange={this.onSelectChange}
options={stateOptions}
value={option}
controlShouldRenderValue={false}
/>
)}
</Dropdown>
);
}
}
这是我的解决方案 live example。
您可以注意到 official react-select examples 中也存在该错误。即使在选择后单击 blur
按钮也无法解决问题。
当用户 closes
菜单和 saves + automatically closes
操作时,代码可能略有不同。
我看到你在 github 上打开了一个 issue。让我们拭目以待。