记录React使用connect后,ref.current为null问题及解决

 更新时间:2023年05月12日 09:41:47   作者:草率小猿  
记录React使用connect后,ref.current为null问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

问题

在用React开发项目的过程中,遇到一个问题,使用connect连接低阶组件包装成高阶组件HOC后,父组件通用ref调用子组件方法时,提示xxxRef.current为null的错误。

代码如下:

// 子组件
// 通过connect方式连接为高阶组件
export default connect(
    mapStateToProps,
)(ComboSelectorForm);
// 父组件
constructor(props: IComboSelectorListProps | Readonly<IComboSelectorListProps>) {
    super(props);
    // ...
    this.formRef = React.createRef();
    // ...
}
// 组件挂载在formRef上
<ComboSelectorForm
    ref={this.formRef}
    id={this.state.id}
    onSaveSuccess={this.handleSaveSuccess}
>
</ComboSelectorForm>
// 调用子组件方法
this.formRef.current.methodName();

父组件调用子组件方法后,报以下错误

TypeError: Cannot read properties of null (reading 'methodName')

解析

React的高阶组件HOC,可以理解成在低阶组件上进行一些封装。

高阶组件HOC如果不做一些特殊处理,是无法直接访问低阶组件实例的,要想通过ref访问低阶组件实例,调用connect时,需要传递参数{forwardRef : true}。

connect方法有四个参数,官方文档是这样说明的:

  • mapStateToProps?: Function
  • mapDispatchToProps?: Function | Object
  • mergeProps?: Function
  • options?: Object

对于前面三个参数先不展开来讲解,主要第四个options参数,有以下几个属性:

{
  context?: Object,
  pure?: boolean,
  areStatesEqual?: Function,
  areOwnPropsEqual?: Function,
  areStatePropsEqual?: Function,
  areMergedPropsEqual?: Function,
  forwardRef?: boolean,
}

其中最后一个参数forwardRef正是我们的主角,官方文档里这样解释:

If {forwardRef : true} has been passed to connect, adding a ref to the connected wrapper component will actually return the instance of the wrapped component.

当该参数forwardRef设置为true时,包裹组件(wrapper component )的ref属性将会实际返回被包裹组件(wrapped component)实例。

OS:原谅我翻译水平有限。(>_<)

最终解决方案

直接上代码:

// 子组件
// 通过connect方式连接为高阶组件
export default connect(
    mapStateToProps,
    null,    // 新加参数
    null,    // 新加参数
    { forwardRef: true }    // 新加参数
)(ComboSelectorForm);
// 父组件,与之前代码一致
constructor(props: IComboSelectorListProps | Readonly<IComboSelectorListProps>) {
    super(props);
    // ...
    this.formRef = React.createRef();
    // ...
}
// 组件挂载在formRef上
<ComboSelectorForm
    ref={this.formRef}
    id={this.state.id}
    onSaveSuccess={this.handleSaveSuccess}
>
</ComboSelectorForm>
// 调用子组件方法
this.formRef.current.methodName();

通过以上改造后,父组件能够正常访问ref实例。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 详解react-router4 异步加载路由两种方法

    详解react-router4 异步加载路由两种方法

    本篇文章主要介绍了详解react-router4 异步加载路由两种方法 ,具有一定的参考价值,有兴趣的可以了解一下
    2017-09-09
  • react+antd4实现优化大批量接口请求

    react+antd4实现优化大批量接口请求

    这篇文章主要为大家详细介绍了如何使用react hooks + antd4实现大批量接口请求的前端优化,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下
    2024-02-02
  • react实现列表滚动组件功能

    react实现列表滚动组件功能

    在开发项目的时候,从服务端获取到数据列表后,展示给用户看,需要实现数据自动滚动效果,怎么实现呢,下面小编给大家分享react实现列表滚动组件功能实现代码,感兴趣的朋友一起看看吧
    2023-09-09
  • React + Node.js实现图片上传功能

    React + Node.js实现图片上传功能

    最近笔者在开发个人博客的后台管理系统,里面用到了图片上传相关的功能,在这里记录并分享一下,希望可以帮到大家,话不多说直接开始吧,感兴趣的朋友可以参考下
    2024-01-01
  • 作为老司机使用 React 总结的 11 个经验教训

    作为老司机使用 React 总结的 11 个经验教训

    这篇文章主要介绍了作为老司机使用 React 总结的 11 个经验教训,需要的朋友可以参考下
    2017-04-04
  • react 表单数据形式配置化设计

    react 表单数据形式配置化设计

    这篇文章主要介绍了react表单数据形式配置化设计,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-07-07
  • React导入less及其注意事项说明

    React导入less及其注意事项说明

    在Vite构建的React项目中,直接安装和导入Less即可使用,但需注意的是,Less的样式作用域不局限于模块内部,可能造成样式污染,建议通过修改文件名和导入方式来避免此问题
    2024-11-11
  • React报错Function components cannot have string refs

    React报错Function components cannot have string refs

    这篇文章主要为大家介绍了React报错Function components cannot have string refs解决方案详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • forwardRef 中React父组件控制子组件的实现代码

    forwardRef 中React父组件控制子组件的实现代码

    forwardRef 用于拿到父组件传入的 ref 属性,这样在父组件便能通过 ref 控制子组件,这篇文章主要介绍了forwardRef - React父组件控制子组件的实现代码,需要的朋友可以参考下
    2024-01-01
  • React避免不必要的重新渲染的方法示例

    React避免不必要的重新渲染的方法示例

    构建高性能 React 应用程序的关键之一是避免不必要的重新渲染,React 的渲染引擎是高效的,但防止在不需要的地方重新渲染仍然至关重要,在这篇文章中,我们将介绍常见错误以及如何避免它们,需要的朋友可以参考下
    2024-10-10

最新评论