小编典典

如何处理循环内的ref?

reactjs

以下是我的父级组件,但是如何选择关注哪个输入呢?在这种情况下是否必须创建动态引用?

class TestRef extends React.Component {
  ref = React.createRef();
  state = {
    data: [
      {
        name: "abc"
      },
      { name: "def" }
    ]
  };
  focusInput = () => this.ref.current.focus();
  render() {
    return (
      <div>
        {this.state.data.map(o => {
          return <Hello placeholder={o.name} ref={this.ref} />;
        })}
        <button onClick={this.focusInput}>focus input 1</button>
        <button onClick={this.focusInput}>focus input 2</button>
      </div>
    );
  }
}

阅读 484

收藏
2020-07-22

共1个答案

小编典典

您可以使用回调引用来生成并将每个输入的动态引用存储在数组中。现在,您可以使用ref的索引来引用它们:

const Hello = React.forwardRef((props,  ref) => <input ref={ref} />);



class Button extends React.Component {

  onClick = () => this.props.onClick(this.props.id);



  render() {

    return (

      <button onClick={this.onClick}>{this.props.children}</button>

    );

  }

}



class TestRef extends React.Component {

  state = {

    data: [

      {

        name: "abc"

      },

      { name: "def" }

    ]

  };



  inputRefs = [];



  setRef = (ref) => {

    this.inputRefs.push(ref);

  };



  focusInput = (id) => this.inputRefs[id].focus();



  render() {

    return (

      <div>

        {this.state.data.map(({ name }) => (

          <Hello

            placeholder={name}

            ref={this.setRef}

            key={name} />

        ))}

        <Button onClick={this.focusInput} id={0}>focus input 1</Button>

        <Button onClick={this.focusInput} id={1}>focus input 2</Button>

      </div>

    );

  }

}



ReactDOM.render(<TestRef />, document.getElementById("root"));


<script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>

<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>



<div id="root"></div>
2020-07-22