React笔记——高级指引:5.Refs转发

1.什么是Ref转发

Ref转发是一项将ref自动地通过组件传递到其一子组件的技巧。

2.转发refs到DOM组件


使用 FancyButton 的组件可以获取底层 DOM 节点 button 的 ref ,并在必要时访问,就像其直接使用 DOM button 一样。

注意

第二个参数 ref 只在使用 React.forwardRef 定义组件时存在。常规函数和 class 组件不接收 ref 参数,且 props 中也不存在 ref

Ref 转发不仅限于 DOM 组件,你也可以转发 refs 到 class 组件实例中。

3.组件库维护者的注意事项

当你开始在组件库中使用 forwardRef 时,你应当将其视为一个破坏性更改,并发布库的一个新的主版本。 这是因为你的库可能会有明显不同的行为(例如 refs 被分配给了谁,以及导出了什么类型),并且这样可能会导致依赖旧行为的应用和其他库崩溃。

 

出于同样的原因,当 React.forwardRef 存在时有条件地使用它也是不推荐的:它改变了你的库的行为,并在升级 React 自身时破坏用户的应用。

4.在高阶组件中转发refs

从一个输出组件 props 到控制台的 HOC 示例开始:



  • “logProps” HOC 透传(pass through)所有 props 到其包裹的组件,所以渲染结果将是相同的
  • 有一点需要注意:refs 将不会透传下去。这是因为 ref 不是 prop 属性。就像 key 一样,其被 React 进行了特殊处理。如果你对 HOC 添加 ref,该 ref 将引用最外层的容器组件,而不是被包裹的组件。
  • 这意味着用于我们 FancyButton 组件的 refs 实际上将被挂载到 LogProps 组件:

5.在 DevTools 中显示自定义名称

React.forwardRef 接受一个渲染函数。React DevTools 使用该函数来决定为 ref 转发组件显示的内容。

1.例如,以下组件将在 DevTools 中显示为 “ForwardRef”:


2.如果你命名了渲染函数,DevTools 也将包含其名称(例如 “ForwardRef(myFunction)”):


3.你甚至可以设置函数的 displayName 属性来包含被包裹组件的名称: