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

如何在react-router-dom v6的Outlet Context中传递多个上下文?

在React Router v6的Outlet Context中传递多个属性的正确方式

嘿,这当然是可行的!你之前的问题出在**多次调用useOutletContext()**上——这个钩子每次调用都会返回你通过<Outlet context={...}>传递的完整上下文对象,所以你两次调用拿到的其实是同一个对象,自然没法正确解构出两组状态和方法。

正确的实现方式

我们只需要在子组件中一次获取完整的上下文对象,然后解构出需要的属性就可以了。

父路由文件(layout.js)

保持你传递对象的写法就行,把多个状态分组放在上下文对象里:

export default function Layout() {
  const [darkMode, setDarkMode] = useState(false);
  const [color, setColor] = useState("#fff");
  
  return (
    <>
      {/* Header */}
      {/* Content */}
      <Outlet 
        context={{ 
          darkMode: [darkMode, setDarkMode], 
          color: [color, setColor] 
        }} 
      />
      {/* Footer */}
    </>
  )
}

子路由文件(login.js)

只调用一次useOutletContext(),然后从返回的对象中解构出darkMode和color,再进一步解构它们的状态和方法:

export default function Login() {
  const { darkMode, color } = useOutletContext();
  const [darkModeValue, setDarkModeValue] = darkMode;
  const [colorValue, setColorValue] = color;
  
  return (
    {/* 这里可以使用darkModeValue、setDarkModeValue、colorValue、setColorValue */}
    <div>
      <p>当前主题模式:{darkModeValue ? "深色" : "浅色"}</p>
      <p>当前颜色:{colorValue}</p>
    </div>
  )
}

或者你也可以在解构的时候一步到位,写法更简洁:

export default function Login() {
  const { 
    darkMode: [darkModeValue, setDarkModeValue],
    color: [colorValue, setColorValue]
  } = useOutletContext();
  
  return (
    {/* 你的组件代码 */}
  )
}

关键要点

  • useOutletContext()是一个单次调用获取全部上下文的钩子,不要多次调用它。
  • 你可以通过对象、数组等任意格式传递上下文,只要在子组件中正确解构对应的数据结构即可。
  • 如果需要传递的属性很多,建议把上下文封装成一个清晰的对象,这样代码可读性更高,也更容易维护。

内容的提问来源于stack exchange,提问作者Mustafa Özkan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 17:37:44