javascript - 为什么组件重新渲染后输入元素没有重新获得焦点?

标签 javascript reactjs

下面是代码:

export class Editor extends Component {
   constructor(props) {
      super(props);
      this.state = {
         name: ""
      }
   }

   handleChange = (event) => {
        event.persist();
        this.setState({ name: event.target.value });
   }

   render() {
      ...
       <input name="name" autoFocus={true} value={this.state.name} onChange={this.handleChange} />
       <button onClick={this.handleAdd}>
          Add
       </button>
   }
}

因此,组件第一次渲染时,输入元素确实具有焦点,因为我使用了 autoFocus={true}。但是当我点击按钮后,焦点并没有回到输入,而是停留在按钮上。我的问题是:

为什么输入没有重新获得焦点?由于 onClick 处理程序更新了组件的状态,这使得组件再次重​​新渲染,当组件重新渲染时, autoFocus={true} 不是也会重新应用吗?

最佳答案

如果您使用自动对焦,则只有初始渲染才会获得焦点。由于 React 仅智能地重新渲染已更改的元素,因此 autofocus 属性并非在所有情况下都可靠。

如果您使用函数组件会更容易,但您可以在类组件中执行以下操作。

export class Editor extends Component {
   constructor(props) {
      super(props);
      this.state = {
         name: ""
      }
      this.nameInput = React.createRef();
   }

   handleChange = (event) => {
        event.persist();
        this.setState({ name: event.target.value });
   }

   handleAdd = () => {
       this.nameInput.current.focus();
   }

   render() {
      ...
       <input ref={this.nameInput} name="name" autoFocus={true} value={this.state.name} onChange={this.handleChange} />
       <button onClick={this.handleAdd}>
          Add
       </button>
   }
}

如果您想了解另一种方法,您可以查看此处:https://stackoverflow.com/a/54159564/5562701

https://davidwalsh.name/react-autofocus

关于javascript - 为什么组件重新渲染后输入元素没有重新获得焦点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58670857/

相关文章:

JavaScript 输入阿拉伯字母验证

javascript - Angular2 - Loopback-sdk-builder - 如何在 api 调用中设置 header

javascript - 如何将 bunyan 日志记录函数绑定(bind)到 ES6 中的类函数?

reactjs - 如何使用 mouseEvent 和 event.target 键入事件(使用 typescript react 项目)?

javascript - 如何只更新关联数组中嵌套对象的一个​​特定属性

javascript - 如何在 next.js 中延迟加载渲染阻塞 css?

reactjs - EsLint 错误解释 no-unused-vars 中的导入语句

javascript - 如何让 Twitter Bootstrap 的模式在 iPhone 上正确显示?

javascript - 用 React 兼容的样式替换所有 html 样式属性

javascript - 简单的 for 循环似乎无法正常工作