在 ReactJS 中使用 state 和 Function 组件时如何使输入不失去焦点?

Posted

技术标签:

【中文标题】在 ReactJS 中使用 state 和 Function 组件时如何使输入不失去焦点?【英文标题】:How to make the input not to lose focus when using state and Function components in ReactJS? 【发布时间】:2017-10-04 02:20:06 【问题描述】:

我使用 Function 组件来渲染组件。 但是只要设置了状态,输入控件就会失去焦点。

如何更改下面的代码以使输入不会失去焦点?我需要该组件是一个 Function 组件。

我的表单上有 10 个输入,因此取决于哪个文本框已更改,它应该在呈现后将焦点放在更改的文本框上。

在 changeHandler(event) 中,我知道包含引用已更改文本框的目标属性的事件,因此我需要在呈现状态后将焦点设置到目标输入元素。

也许我应该定义一个类级别的变量并将目标设置为那个。

import React, Component from 'react';

export default class PlaybackPassword extends Component   

constructor(props) 
        super(props);
          this.state = 
            setting: 
          
        this.focusElement = null;    
        this.changeHandler= this.changeHandler.bind(this); 
    

    componentDidUpdate()
    
      if (this.focusElement != null)
      this.focusElement.focus();
     

     changeHandler(event)
          
            this.focusElement = event.target;
            var setting = this.state.setting;
            setting.SelectedValue = event.target.value;  
            this.setState(setting : setting);
        
    render() 
            var parent = this;
            function Password(props)
            
                return (<div className="password">
                  <input type="password" 
                    value=props.selectedValue onChange=parent.changeHandler /> 
                </div>);
             
            return (
            <div className="playbackPassword">
                <Password selectedValue=this.state.setting.SelectedValue  /> 
            </div>         
            );
        

【问题讨论】:

您可以将autoFocus 属性传递给输入元素。如果输入在更新期间的任何时候失去焦点,您可以设置一个 ref 并在 componentDidUpdate 生命周期方法中手动关注它。 能否提供示例代码? 在分配onChange 处理程序后,只需将autoFocus 添加为属性即可。 ***.com/questions/28889826/… React set focus on input after render的可能重复 如果你稍微清理一下代码,我认为你不会遇到自动对焦问题:密码组件应该移到渲染之外。 【参考方案1】:

在示例代码中,您在每次渲染时定义(即创建)一个新的function Password。这意味着您的 &lt;Password&gt; 组件每次都将是一个全新的组件。

关键是在 render 函数之外定义你的函数一次,以便 React 可以跟踪 &lt;Password&gt; 组件实际上是渲染之间的同一个组件。

示例:https://codesandbox.io/s/nn2nwq2lzp

注意:您将无法使用parent,但需要传递一个道具。

【讨论】:

以上是关于在 ReactJS 中使用 state 和 Function 组件时如何使输入不失去焦点?的主要内容,如果未能解决你的问题,请参考以下文章

Reactjs 入门基础

为啥我们需要在 ReactJS 中使用 bind() 来访问 this.props 或 this.state? [复制]

setState ReactJS 中的 this.state

ReactJS 中的 this.state 和 this.setstate 有啥区别?

ReactJS Redux State(全局状态)+ React.Context(本地状态)

401(未经授权)ReactJS