Search code examples
reactjsautosuggest

How to focus a input field, which is located in a child component


I have a button in a parent component. I want to focus an input field, which is located in a child component, by clicking on that button. How can I do it.


Solution

  • You can make use of refs to achieve the result

    class Parent extends React.Component {
      
      handleClick = () => {
        this.refs.child.refs.myInput.focus();
      }
      render() {
        return (
          <div>
            <Child ref="child"/>
            <button onClick={this.handleClick.bind(this)}>focus</button>
          </div>
        )
      }
    }
    
    class Child extends React.Component {
      render() {
        return (
          <input type="text" ref="myInput"/>
        )
      }
    }
    
    ReactDOM.render(<Parent/>, document.getElementById('app'));
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
    <div id="app"></div>

    UPDATE:

    React docs recommend on using a ref callback rather than string refs

    class Parent extends React.Component {
      
      handleClick = () => {
        this.child.myInput.focus();
      }
      render() {
        return (
          <div>
            <Child ref={(ch) => this.child = ch}/>
            <button onClick={this.handleClick.bind(this)}>focus</button>
          </div>
        )
      }
    }
    
    class Child extends React.Component {
      render() {
        return (
          <input type="text" ref={(ip)=> this.myInput= ip}/>
        )
      }
    }
    
    ReactDOM.render(<Parent/>, document.getElementById('app'));
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
    <div id="app"></div>