【问题标题】:why input element doesn't regain the focus after the component re-renders?为什么组件重新渲染后输入元素没有重新获得焦点?
【发布时间】:2020-02-28 10:29:39
【问题描述】:

下面是代码:

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 handler更新了组件的状态,使得组件重新渲染,当组件重新渲染时,是不是autoFocus={true}也会重新申请?

【问题讨论】:

    标签: javascript reactjs


    【解决方案1】:

    不,它不会,因为 react 只会重新渲染已更改的元素,David Walsh 很好地解释了这一点,您可能想检查一下。编码愉快!

    【讨论】:

      【解决方案2】:

      如果您使用自动对焦,则只有初始渲染会有焦点。由于 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

      【讨论】:

      • 感谢您的回答。我知道这种方法称为不受控制的表单组件,它使用 refs。所以只需要和你确认一下:即使自动对焦发生了变化,输入元素仍然被认为是不变的?是聪明还是愚蠢?
      • 其实是需要react端解决的,但是他们还没有找到解决办法。我们需要这样的方法,但仍然没有进行 PR 和合并。 github.com/facebook/react/issues/5534#issuecomment-290417284而且你知道的,顺便说一下,你可以在componentDidUpdate中做这个焦点,或者在功能组件中使用useEffect。
      猜你喜欢
      • 2019-08-15
      • 2020-03-02
      • 2014-04-29
      • 2022-01-24
      • 2018-12-12
      • 1970-01-01
      • 2020-06-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多