forwardRef 是 React 提供的一个高阶函数,它可以让你在函数组件中访问子组件的 ref,并把该 ref 传递给子组件。
使用 forwardRef 的主要场景是,当你需要访问子组件的 DOM 节点或实例时,比如要操作子组件的滚动条、聚焦输入框等等。在这些场景下,需要用到 ref,而 ref 又不能直接在函数组件中使用。
下面是 forwardRef 的基本使用方式:
jsxCopy codeimport React, { forwardRef } from 'react';
const MyComponent = forwardRef((props, ref) => {
return <input type="text" ref={ref} />;
});
function App() {
const inputRef = React.createRef();
const handleClick = () => {
inputRef.current.focus();
};
return (
<div>
<MyComponent ref={inputRef} />
<button onClick={handleClick}>Focus Input</button>
</div>
);
}在上面的例子中,我们创建了一个 MyComponent 组件,并通过 forwardRef 来包裹它。这样,MyComponent 就可以在 props 中接收一个 ref 属性,而 forwardRef 将会将该属性转发到子组件中。
在 App 组件中,我们创建了一个 inputRef 对象,并将它作为 MyComponent 的 ref 属性传递给了 MyComponent 组件。然后,我们在 handleClick 函数中使用 inputRef 来聚焦输入框。
需要注意的是,forwardRef 的回调函数接收两个参数:props 和 ref。其中,props 是组件的属性对象,ref 是回调函数中定义的 ref 对象。在函数组件中,我们必须将 ref 传递给要访问的子组件,否则 ref 将无法访问到子组件的 DOM 节点或实例。