React.forwardRef

183 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情

官方文档

zh-hans.reactjs.org/docs/forwar…

涉及一个报错问题 React.forward

Ref写组件有遇到过这种报错吧,想过是为什么吗

devScripts.js: 6523 Warning:Function components can not be given refs.Attempts to access this ref willfail.Did you mean to use React.forward Ref() ?

业务实践

之前写项目有一个列表页面的场景,通过表单查询,利用fusion的CascaderSelect组件封装了一个选择的组件。但是在用Fusion提供的Form组件和Field辅助工具类的时候, React却会给出“Function components can not be given refs."的警告,并提示使用forwardRef,也就是上文提到的报错。

我查了解决方法,加一个React.forwardRef()包裹,能很好的解决的问题,但是并没有详细的介绍为什么这样加?

 React.forwadRef((props, ref)=>{
 //组件逻辑
 return(
   <Select
     dataSource={categories}
     ref={ref}
     {… props}
   />
 )
 })

总结

一般这种问题出现在我们重写select这类包含在form表单里的组件,虽然没有传ref, 但是form是内含的, 不使用React.forwardRef还是会报错。也就是说,Field自定义组件要包裹React.forwardRef()

Ref转发是一项将ref自动地通过组件传递到其一子组件的技巧。组件通过Ref转发,可以把子元素到ref引用暴露给更高层的组件。

这是Field中通过回调形式的ref引用了选择组件,而ref本身并不是一个prop,所以并不会通过props传递给组件。 因为传数据的时候有要求

<Form ref={ref}>

可以这么传吗,不可以,这里相当于props,因为ref相当于react的关键字, props里是不能传关键字的。这就用到了React 16.3提供了一个forwardRef的函数,forwardRef能够将ref引用传递给下游子组件,也适用于解决之前HOC包装组件所带来的ref引用不对的问题。

fusion组件的自定义form为什么必须要包ref有以下解释

github.com/alibaba-fus…

**