函数组件如何使用useRef

1,941 阅读2分钟
最近因为如何获取子元素的实例而苦恼。也查了相关的资料。我觉得都是千篇一律的去教你如何操作dom。
而我只是简简单单的想要实现类方法中的获取子元素的state。经过查阅以及研究,我在这里给大家分享一下我的方法。
一、三个知识点!
    1.useRef
    2.forwardRef
    3.useImperativeHandle
二、了解他们
    1.useRef
        在这里我不认为他有什么需要理解的。他就是相当于类组件中的React.createRef()。只是没办法简简
        单单的使用到自己定义的子组件当中。
    2.forwardRef    
        ok,结合上下文,它的出现,就是为了能够使你的ref能够在自定义的子组件中使用。
    3.useImperativeHandle   
        举个例子,当我们使用了useRef,forwardRef后,你可以看到你的实例了,如果将ref挂载到某些元素
    标签上,你也可以看到完全可以操作dom了。但是想一下,类组件中,你挂载之后,子组件的state,props以
及定义的方法,都在current中了,但是函数组件中并没有,不要慌,useImperativeHandle就是来让你实现这个
逻辑的,而且可以只暴露你想要暴露的值。
 三、栗子栗子栗子
 

image.png

image.png

可以看到,第一步我已经使用了useRef,这里我就不打印filterFormRef了,有兴趣的同学可以打印一下,毕竟他们是空的,是空的
- -....。 所以我们就需要进行下一步了。

image.png

在这里,我们又用到了forwardRef,书写方式如上,无非就是你写好了你的函数组件,再包裹到forwardRef当中去,不难理解他。
这个时候,你就能看到你传入的ref了,然而,并没有上面卵用,这并不是我想要的。当然,如果只是单纯的想操作子组件中的某个
组件,这样已经完全ok了,eg:<input ref={ref}></input>  ps:这是我在网上看过到最多的栗子了- -。。
(万恶的我,我也抄袭了)。这样,你就可以在父组件中去操作这个input的dom了。当然,最后一个才是我想要的!!

image.png

通过使用useImperativeHandle,我定义了一个name的状态,我想要获取这个值在父组件中进行接口查询,然后我给大家打印一下
这次子组件的实例

image.png

image.png

image.png

这样,就获取到了我想要的啦。希望这样可以解决大家的需要 ps:第一次写,也是才尝试,如果哪里有不对的地方,希望大家可以帮忙指正一下子