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

React Prop Drilling为何只能传递单个状态参数而非状态与状态设置器?

问题原因与解决方案

首先明确:Prop Drilling完全支持同时传递状态和状态更新函数,你的问题并非是Prop Drilling的限制,而是代码中的语法错误、XState API使用错误导致的。

核心错误点

1. JSX语法未闭合

你的CreateMyJSX组件中,if分支的return语句缺少闭合括号,这会导致JS引擎解析组件代码时出错,进而引发参数传递异常(比如部分参数丢失为null):

// 错误写法
return(<> <div className="MyCrazyADiv" /></>
// 正确写法,补全闭合括号
return(<> <div className="MyCrazyADiv" /></>);

2. XState useMachine API误用

XState的useMachine返回值并非[state, setState],而是[state, send]——状态更新需要通过send函数发送事件,而非直接修改状态。你错误地将send命名为setState,虽然类型用了any不会报错,但如果机器配置或事件名称不匹配,可能导致函数调用异常,甚至在语法错误叠加下出现null的情况。

修正后的完整代码

针对XState场景

// 导入XState类型(可选但推荐)
import { State, Sender, useMachine } from 'xstate';
import { aRandomXStateMachineIincluded } from './your-machine-file';

// 定义更精确的Props类型(替代any)
interface MyProps { 
  myState: State<any>; // 建议替换为你的机器状态具体类型
  send: Sender<any>;
};

const CreateMyJSX = ({ myState, send, ...props }: MyProps) => {
  console.log(myState);
  console.log(send);

  if (myState.matches("StateA")) {
    send("goToStateB"); // 使用send发送事件
    return <> <div className="MyCrazyADiv" /> </>;
  } else {
    return <> <div className="BtierDiv" /> </>;
  }
};

export default function App() {
  const [myState, send] = useMachine(aRandomXStateMachineIincluded);

  return (
    <> 
      <CreateMyJSX myState={myState} send={send} />
    </>
  );
}

针对useState场景

如果是使用React原生useState,传递状态和setter完全没有限制,确保语法正确即可:

import { useState } from 'react';

interface MyProps { 
  myState: number; // 示例类型,根据实际场景修改
  setState: React.Dispatch<React.SetStateAction<number>>;
};

const CreateMyJSX = ({ myState, setState, ...props }: MyProps) => {
  console.log(myState);
  console.log(setState);

  if (myState === 0) {
    setState(1);
    return <> <div className="MyCrazyADiv" /> </>;
  } else {
    return <> <div className="BtierDiv" /> </>;
  }
};

export default function App() {
  const [myState, setState] = useState(0);

  return (
    <> 
      <CreateMyJSX myState={myState} setState={setState} />
    </>
  );
}

额外排查点

如果修正后仍出现参数为null的情况,检查以下内容:

  • 组件的导入/导出是否正确,有没有拼写错误
  • 组件是否存在条件渲染逻辑,导致传递参数时某个值未被正确初始化
  • 有没有在组件内部重定义同名变量,覆盖了传入的props

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 13:01:08