使用 React.forwardRef 的值与自定义 ref 道具的值

我看到,React.forwardRef似乎是一种被认可的方式,可以将一个引用从 response 文档传递给一个子功能组件:

const FancyButton = React.forwardRef((props, ref) => (
<button ref={ref} className="FancyButton">
{props.children}
</button>
));


// You can now get a ref directly to the DOM button:
const ref = React.createRef();
<FancyButton ref={ref}>Click me!</FancyButton>;

然而,与简单地传递定制道具相比,这样做的好处是什么:

const FancyButton = ({ innerRef }) => (
<button ref={innerRef} className="FancyButton">
{props.children}
</button>
));


const ref = React.createRef();
<FancyButton innerRef={ref}>Click me!</FancyButton>;

我能想到的唯一优势可能是对裁判有一个一致的 api,但是还有其他优势吗?传递一个自定义道具是否会影响渲染的差异并导致额外的渲染,当然不是因为引用在 current字段中作为可变状态存储?

例如,您想要传递多个 ref (tbh,可能表示代码味道,但仍然) ,那么我能看到的唯一解决方案将是使用 customRef 道具。

我想我的问题是,在定制道具上使用 forwardRef的价值是什么?

17110 次浏览

RefReact组件中的标准属性。

包装其他组件以提供附加功能的一些组件,使用 ref引用包装的组件,并期望该组件具有 ref属性。

一个组件最好具有与其他组件和库兼容的 ref属性。

函数组件不能具有“ ref”属性,必须使用 forwardRef来提供 ref属性。

甚至 反应文件也提到自定义裁判道具对 forwardRef来说是一种更灵活的方法:

如果使用 React 16.2或更低版本,或者需要 比裁判转发提供更多的灵活性,则可以使用这种替代方法并显式传递 作为一个不同名称的道具裁判

还有一个 大意,丹•阿布拉莫夫(Dan Abramov)在其中描述了它的优势:

  • 与所有反应版本兼容
  • 为类和函数组件工作
  • 简化了将引用传递到嵌套组件的几层深度

我要补充的是,传递参考作为通常的道具不会导致 突破性的改变,是多个参考的方式去。我想到的 forwardRef唯一的优点是:

  • 用于 DOM 节点、函数和类组件的统一访问 API (您提到过)
  • ref属性不会膨胀您的道具 API,例如,如果您提供类型与 TypeScript

传递自定义道具是否会影响渲染的差异并导致额外的渲染?

如果将内联 复审裁判函数作为道具向下传递,则 ref 可能触发重新呈现。但无论如何,将它定义为类实例方法或通过某种制表(如 useCallback) ,它都是 好主意