如果 ref 回调函数是以内联函数的方式定义的,在更新过程中它会被执行两次,第一次传入参数 null,然后第二次会传入参数 DOM 元素。这是因为在每次渲染时会创建一个新的函数实例,所以 React 清空旧的 ref 并且设置新的。通过将 ref 的回调函数定义成 class 的绑定函数的方式可以避免上述问题,但是大多数情况下它是无关紧要的。
内联函数的方式定义
class CustomTextInput extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      name: 'hello'
    }
    this.textInput = null
  }
  handleChange = (e) => {
    this.setState({
      name: e.target.value
    })
  }
  handleClick = () => {
    this.setState({
      name: 'world'
    })
  }
  render() {
    return (
      <div>
        <input
          type="text"
          value={this.state.name}
          onChange={this.handleChange}
          ref={(element) => {console.log(element);this.textInput = element}}
        />
        <button onClick={this.handleClick}>change</button>
      </div>
    );
  }
}输出结果
null<input type="text" value="world">
class 绑定函数的方式
class CustomTextInput extends React.Component {
 constructor(props) {
   super(props);
   this.state = {
     name: 'hello'
   }
   this.textInput = null
   this.setTextInputRef = element => {
     console.log(element)
     this.textInput = element
   }
 }
 handleChange = (e) => {
   this.setState({
     name: e.target.value
   })
 }
 handleClick = () => {
   this.setState({
     name: 'world1'
   })
 }
 render() {
   return (
     <div>
       <input
         type="text"
         value={this.state.name}
         onChange={this.handleChange}
         ref={this.setTextInputRef}
       />
       <button onClick={this.handleClick}>change</button>
     </div>
   );
 }
}                










