React中的refs学习笔记

82 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第21天,点击查看活动详情

前言

前几天不幸🐏了,在床上躺了几天,今天恢复一点就继续来水文啦。

React特殊属性ref

通常我们使用state或者props来控制组件的状态,但React还提供了一个特殊的ref属性来换种方式操控组件状态,ref属性常用于管理焦点、文本控制或者视频播放,集成第三方DOM库等,下面是ref属性使用的例子代码:

class AutoFocusTextInput extends React.Component {
  componentDidMount() {
    // 使用原生的 DOM API 获取焦点
    this.textInput.focus();
  }
  render() {
    //  当组件插入到 DOM 后,使用textInput状态引用input元素
    return (
      <div>
        <input type="text" ref={(input)=>{this.textInput=input;}} />
      </div>
    );
  }
}

我们为AutoFocusTextInput组件中的input元素定义ref,以实现当组件挂载时input能够主动获得到焦点,这就是ref属性的作用。

ref属性不仅能用于原生的DOM元素,还可以作用于自定义组件上,不过需要注意,只能为类组件定义ref属性,而函数组件则不行。

ref属性有三种获取方式

  1. 通过字符串获取:this.refs.xxx
  2. 通过回调函数获得
  3. 使用React.createRef方法

其中第一条通过字符串获取的方式已经不被推荐了,React官方现场推荐使用第三种React.createRef的方式来获取ref属性。

ref转发

有时我们可能也需要父组件去操控子组件的dom元素,我们可以使用间接的方式来实现操控。即在子组件上定义ref属性,随后父组件通过回调函数等方式实现引用的传递。例如下面的代码:

function Children(props) {
    return (
            <div>
                <input ref={props.inputRef}/> // 使用父组件传递的inputRef,为input元素的ref属性赋值
            </div>
    )
}
​
class Parent extends React.Component {
    render() {
        return (
                <Children inputRef={{e=>this.inputElement = e}}/>
        )
    }
}

React还提供了一种方式来进行实现组件的ref属性传递子组件的特性,例如下面的官方例子:

const FancyButton = React.forwardRef((props, ref) => (
  <button ref={ref} className="FancyButton">
    {props.children}
  </button>
));
​
// 创建Ref引用变量
const ref = React.createRef();
<FancyButton ref={ref}>Click me!</FancyButton>; 

学习资料