You need to enable JavaScript to run this app. React中能否将State Hook作为prop传递?setState报非函数错误如何解决
优惠活动
大模型
产品
解决方案
定价
更多

React中能否将State Hook作为prop传递?setState报非函数错误如何解决

问题核心说明

首先明确结论:把useState返回的state值和对应的setState函数作为props传递给子组件,是React完全支持的合法写法,不存在语法层面的限制,也是实现跨组件状态共享的标准方案。
你遇到「setzData不是函数」的报错,根源不在传递逻辑,而在子组件接收props的写法错误。

具体错误原因

React的函数组件有统一的入参规则:所有从父组件传入的props,会被打包成单个对象,作为函数的第一个形参传入,不会把每个prop拆成独立的位置参数依次传递。
你当前子组件的错误写法示例:

function Part1(handleSubmit, zData, setzData) {
  // ...
}

实际运行时的参数匹配逻辑为:

  • 第一个形参handleSubmit拿到的是完整的props对象(包含父组件传入的handleSubmit、zData、setzData三个属性的整个对象)
  • 第二个形参zData、第三个形参setzData因为没有对应的位置入参,实际值为undefined
  • 你之前误以为zData能正常读取,大概率是测试时从第一个形参的对象上偶然读取了属性,没有注意到形参的错位问题,最终调用setzData时因为实际值为undefined,就会抛出“不是函数”的报错。

修正方案

按照React的入参规则调整子组件的props接收方式即可,两种常见的正确写法:

  • 先接收完整props对象,在函数内部解构需要的属性
function Part1(props) {
  // 从props对象中拆解需要的方法/数据
  const { handleSubmit, zData, setzData } = props
  return (
    <TextField
      required
      name="firstName"
      label="First Name"
      fullWidth
      autoComplete="First name"
      value={zData.firstname}
      onChange={(e) => setzData({ ...zData, firstname: e.target.value })}
    />
  )
}
  • 直接在函数形参位置对props对象解构,代码更简洁
// 直接对唯一的入参(props对象)做解构
function Part1({ handleSubmit, zData, setzData }) {
  return (
    <TextField
      required
      name="firstName"
      label="First Name"
      fullWidth
      autoComplete="First name"
      value={zData.firstname}
      onChange={(e) => setzData({ ...zData, firstname: e.target.value })}
    />
  )
}

业务思路验证

你目前采用的实现思路本身没有偏差:

  • 把两个表单需要共享的状态(zData、对应的更新方法setzData)沉淀在父组件中维护
  • 父组件根据第一个表单的提交结果控制Part1的显隐
  • 把共享数据和更新方法通过props分发给两个表单组件
    这个链路完全符合React状态提升的最佳实践,调整完子组件的接收逻辑后即可正常运行,不需要切换其他额外的实现方案。
    额外提醒:你当前useState初始化的zData中并没有firstname字段,子组件读取时要注意和state的实际字段名对齐,避免出现值为undefined的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.28 21:06:03