反应文档说:
你不能在函数组件上使用 ref 属性,因为它们没有实例。(更多)
这意味着您不能将 refs 绑定到功能组件。这就是你的ref2.current
原因null
。如果要将 ref 绑定到组件,则需要使用类组件。您ref1
不是Comp1
组件的引用。它实际上包含一个您在useImperativeHandle
钩子中传递的对象。即它包含下一个对象:
{
print: () => {
console.log('comp1')
}
}
forwardRef
如果要将 ref 与组件呈现的某些 HTML 元素或类组件绑定,则必须使用功能组件。useImperativeHandle
或者您可以使用钩子将您的 ref 与某个对象绑定。
更新
的使用与useImperativeHandle
向您的类组件添加方法相同:
class Comp1 extends React.Component {
print() {
console.log('comp1');
}
render() {
return (<div>comp1</div>)
}
}
是相同的
const Comp1 = forwardRef((props, ref) => {
useImperativeHandle(ref, () => ({
print: () => {
console.log('comp1')
}
}), []);
return <div>comp1</div>
});
你在评论中问:
所以在转向钩子(并且仍然避免使用类)之后,使用 ref 的唯一方法是使用useImperativeHandle
(并且实际上使用“假” ref)?这是一个好习惯吗?
答:使用 ofuseImperativeHandle
与在类组件中通过 refs 调用子组件方法是一样的坏习惯。React 文档说你应该避免通过 refs 调用子组件方法,你应该避免使用useImperativeHandle
. 此外,您需要避免在没有它们的情况下使用 refs。