You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React函数组件如何通过ref调用子组件方法,解决ref.current为null报错

问题原因

你遇到的报错核心有2个原因:

  • React的函数式组件默认没有实例,直接给函数组件绑定ref属性会无法生效,最终modalRef.current就是null
  • 父组件中绑定按钮点击事件的写法错误,React的事件名需要用驼峰格式onClick而非原生HTML的小写onclick

要实现父组件调用子组件内部方法的需求,需要用forwardRef配合useImperativeHandle暴露子组件的指定方法给父组件的ref,修正后的代码如下:

修正后父组件代码

import { useRef } from 'react';
import Modal from './Modal';

const Parent = () => {
  // 函数组件内优先用useRef创建ref,会在多次渲染间保持引用不变
  const modalRef = useRef(null);
  const onBtnClick = () => {
    // 加可选链做兜底判断,避免组件未挂载时调用报错
    modalRef.current?.upadeState();
  }
  return(
    <div>
      <button onClick={onBtnClick}>bro</button>
      <Modal ref={modalRef} />
    </div>
  )
}

export default Parent;

修正后子组件代码

import { forwardRef, useImperativeHandle } from 'react';

// 用forwardRef包裹组件,接收父级传入的ref
const Modal = forwardRef((props, ref) => {
  const upadeState = () => {
    console.log('It works fam');
  }

  // 把需要对外暴露的方法/属性在这里返回
  useImperativeHandle(ref, () => ({
    upadeState
  }));

  return(
    <div>
      bro we here
    </div>
  )
})

export default Modal;

额外注意

除非是无法用props驱动的场景(比如手动控制滚动、弹窗动画触发等),否则优先通过props传递状态/回调来控制子组件逻辑,不要滥用ref调用子组件内部方法,避免代码数据流变得混乱。

内容的提问来源于stack exchange,提问作者bihire boris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 17:36:03