focus() 显示后未在输入字段上设置(使用 refs)
focus() doesn't set on input field after displaing (use refs)
愚蠢的 React 问题:输入显示后如何设置焦点以及为什么我的代码不起作用? (没有显示切换它可以工作。)
编辑: 我期望的是:单击按钮后,输入字段出现(通过删除 .dnone class)并获得焦点。 (但事实并非如此。)
我的代码:
import "./styles.css"; // with .dnone class with display:none
import React from 'react';
export default class App extends React.Component {
constructor(props) {
super(props);
this.input = React.createRef();
this.state = {
active: false
}
}
click = (e) => {
e.preventDefault();
this.setState({
active: true
});
this.input.current.focus();
}
render () {
return (
<div className="App">
<input type="text" ref={this.input} className={(this.state.active ? "" : "dnone")} />
<button type="button" onClick={(e) => this.click(e)}>click</button>
</div>
);
}
}
现场演示:https://codesandbox.io/s/immutable-sea-9884z?file=/src/App.js:0-607
谢谢!
问题在于 React 状态更新是异步处理的,因此在点击处理程序中,当您将状态更新加入队列时,您会立即尝试关注输入,但由于 active
状态尚未更新但是你不能,dnone
类名还没有被删除并且输入可见。
将焦点逻辑移至 componentDidUpdate
生命周期方法以“响应”active
状态更新。
componentDidUpdate(prevProps, prevState) {
if (prevState.active !== this.state.active && this.state.active) {
this.input.current.focus();
}
}
click = (e) => {
e.preventDefault();
this.setState({
active: true
});
}
愚蠢的 React 问题:输入显示后如何设置焦点以及为什么我的代码不起作用? (没有显示切换它可以工作。)
编辑: 我期望的是:单击按钮后,输入字段出现(通过删除 .dnone class)并获得焦点。 (但事实并非如此。)
我的代码:
import "./styles.css"; // with .dnone class with display:none
import React from 'react';
export default class App extends React.Component {
constructor(props) {
super(props);
this.input = React.createRef();
this.state = {
active: false
}
}
click = (e) => {
e.preventDefault();
this.setState({
active: true
});
this.input.current.focus();
}
render () {
return (
<div className="App">
<input type="text" ref={this.input} className={(this.state.active ? "" : "dnone")} />
<button type="button" onClick={(e) => this.click(e)}>click</button>
</div>
);
}
}
现场演示:https://codesandbox.io/s/immutable-sea-9884z?file=/src/App.js:0-607
谢谢!
问题在于 React 状态更新是异步处理的,因此在点击处理程序中,当您将状态更新加入队列时,您会立即尝试关注输入,但由于 active
状态尚未更新但是你不能,dnone
类名还没有被删除并且输入可见。
将焦点逻辑移至 componentDidUpdate
生命周期方法以“响应”active
状态更新。
componentDidUpdate(prevProps, prevState) {
if (prevState.active !== this.state.active && this.state.active) {
this.input.current.focus();
}
}
click = (e) => {
e.preventDefault();
this.setState({
active: true
});
}