ref
Ref 转发是一个可选特性,其允许某些组件接收 ref,并将其向下传递(换句话说,“转发”它)给子组件。
ref 转发使用 React.forwardRef方法。
在下面的示例中,FancyButton 使用 React.forwardRef 来获取传递给它的 ref,然后转发到它渲染的 DOM button:
const FancyButton = React.forwardRef((props, ref) => (
<button ref={ref} className="FancyButton">
{props.children}
</button>
));
// 你可以直接获取 DOM button 的 ref:
const ref = React.createRef();
<FancyButton ref={ref}>Click me!</FancyButton>;
这样,使用 FancyButton 的组件可以获取底层 DOM节点 button 的 ref ,并在必要时访问,就像其直接使用 DOM button
一样。
以下是对上述示例发生情况的逐步解释:
- 我们通过调用
React.createRef创建了一个React ref并将其赋值给ref变量。 - 我们通过指定
ref为JSX属性,将其向下传递给<FancyButton ref={ref}>。 React传递ref给forwardRef内函数 (props, ref) => ...,作为其第二个参数。- 我们向下转发该
ref参数到<button ref={ref}>,将其指定为JSX属性。 - 当
ref挂载完成,ref.current将指向<button>DOM 节点。
WARNING
第二个参数 ref 只在使用 React.forwardRef 定义组件时存在。常规函数和 class 组件不接收 ref 参数,且 props 中也不存在 ref。
Ref 转发不仅限于 DOM 组件,你也可以转发 refs 到 class 组件实例中。
创建ref的方式
import React, { useRef } from 'react';
// 使用React.createRef
const a = React.createRef(null);
a.current
// 使用useRef 只能在hooks组件中使用
const b = useRef(null);
a.current
// 使用ref字符串
<button ref="btn" onClick={this.log}>点我绘图</button>
this.refs.btn
// 使用ref对象
<button ref={n=>this.btn=n} onClick={this.log}>点我绘图</button>
this.btn