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

React使用useRef获取子组件input值返回None的问题排查

问题分析

代码拿不到输入框值的核心错误有4个:

  • 父组件导入不全:使用了useState钩子但只从react中引入了useRef,运行时会直接抛出useState未定义的错误。
  • 变量声明不规范:inputRef = useRef(null) 漏写了const声明,属于隐式全局变量,严格模式下会直接报错。
  • 核心错误:函数组件默认不支持直接接收ref作为props传递。ref是React的特殊保留属性,你在子组件props中解构ref拿到的永远是undefined,导致父组件传入的inputRef根本没有绑定到实际的input DOM上,取值自然为null。
  • 子组件类型定义错误:Props中声明了ref字段,还额外解构了未定义的value属性,存在类型错误。
修复方法

函数组件要接收外部传入的ref并绑定到内部DOM,必须使用React.forwardRef做ref转发,同时修正上述语法问题。

修正后的父组件代码

import React, { useRef, useState } from "react";
import Child from "./path/to/Child"; // 替换为你的子组件实际路径

const Parent= () => {
  // 补全const声明
  const inputRef = useRef(null)
  
  const initData = {
      inputVal: [],
  }; 

  const [data, setData] = useState(initData);

  async function fetchData(e) {
    e?.preventDefault();
    const response = await POST("/api", {
      input: inputRef.current?.value,
    });
    const json = await response.json();
    setData({
      inputVal: json.inputVal,
    });
  }

  return (
    <form onSubmit={fetchData}>
        <Child ref={inputRef} />
        <button type="submit">提交</button>
    </form>
  );
};

export default Parent;

修正后的子组件代码

import React from "react";

// 使用forwardRef包裹组件,接收外部传入的ref
const Child = React.forwardRef<HTMLInputElement>((props, ref) => {
  return <input type="number" ref={ref} />;
});

export default Child;

补充:如果不需要操作DOM的其他能力,更推荐用受控组件的方式(给input绑定value和onChange,把输入值存在父组件state中)实现取值,代码可维护性更高。

内容的提问来源于stack exchange,提问作者Denver Dang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 01:18:30