createRef
createRef 会创建一个可包含任意值的 ref 对象。
class MyInput extends Component {
inputRef = createRef();
// ...
}参考
createRef()
import { createRef, Component } from 'react';
class MyComponent extends Component {
intervalRef = createRef();
inputRef = createRef();
// ...参数
createRef 不接受任何参数。
返回值
createRef 返回一个对象,该对象只有一个属性:
current:初始值为null。你之后可以把它设置为其他值。如果你将 ref 对象作为ref属性传递给 JSX 节点,React 会设置它的current属性。
注意事项
createRef每次都会返回一个不同的对象。它等价于你自己写{ current: null }。- 在函数组件中,你大概率应该改用
useRef,因为它总是返回同一个对象。 const ref = useRef()等价于const [ref, _] = useState(() => createRef(null))。
用法
在类组件中声明 ref
要在 类组件 内声明一个 ref,调用 createRef 并将其结果赋值给类字段:
import { Component, createRef } from 'react';
class Form extends Component {
inputRef = createRef();
// ...
}如果你现在在 JSX 中把 ref={this.inputRef} 传给一个 <input>,React 会将输入框的 DOM 节点填充到 this.inputRef.current 中。例如,下面演示了如何创建一个聚焦输入框的按钮:
import { Component, createRef } from 'react'; export default class Form extends Component { inputRef = createRef(); handleClick = () => { this.inputRef.current.focus(); } render() { return ( <> <input ref={this.inputRef} /> <button onClick={this.handleClick}> 聚焦输入框 </button> </> ); } }
替代方案
将使用 createRef 的类迁移为使用 useRef 的函数组件
我们建议在新代码中使用函数组件,而不是 类组件。如果你已有一些使用 createRef 的类组件,下面介绍如何转换它们。这是原始代码:
import { Component, createRef } from 'react'; export default class Form extends Component { inputRef = createRef(); handleClick = () => { this.inputRef.current.focus(); } render() { return ( <> <input ref={this.inputRef} /> <button onClick={this.handleClick}> 聚焦输入框 </button> </> ); } }
当你将这个组件从类转换为函数时,把对 createRef 的调用替换为对 useRef 的调用:
import { useRef } from 'react'; export default function Form() { const inputRef = useRef(null); function handleClick() { inputRef.current.focus(); } return ( <> <input ref={inputRef} /> <button onClick={handleClick}> 聚焦输入框 </button> </> ); }