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

React如何向Route渲染的布局Body、侧边栏等子组件传递Props?

解决方案

有两种常用实现方式,按需选择即可:

方案1:使用 Context 跨层级传递(推荐)

适合需要传递的参数、函数较多,或子组件层级较深的场景:

第一步:改造 default.jsx 提供 Context

import { createContext, useContext, useState } from 'react'

// 创建布局上下文
const DefaultLayoutContext = createContext()
// 封装自定义Hook,方便子组件调用
export const useDefaultLayout = () => useContext(DefaultLayoutContext)

const Default = ({children}) => {
  // 定义你需要传递的状态和函数,示例如下
  const [sidebarOpen, setSidebarOpen] = useState(true)
  const toggleSidebar = () => setSidebarOpen(prev => !prev)
  const activeNavKey = '/dashboard'

  // 要传递给子组件的所有数据和方法
  const layoutPayload = {
    sidebarOpen,
    toggleSidebar,
    activeNavKey
  }

  return (
    <Layout>
      <Layout.Body id="main-content">
        <div>
          {/* 用Provider包裹children,注入数据 */}
          <DefaultLayoutContext.Provider value={layoutPayload}>
            {children}
          </DefaultLayoutContext.Provider>
        </div>
      </Layout.Body>
    </Layout>
  )
}
export default Default

第二步:子页面组件直接获取数据

在任意被该布局包裹的路由组件中,直接调用自定义Hook即可拿到布局传递的所有内容:

import { useDefaultLayout } from './default.jsx'

const Dashboard = () => {
  const { toggleSidebar, activeNavKey } = useDefaultLayout()
  return <button onClick={toggleSidebar}>切换侧边栏</button>
}

方案2:改造children为render函数传递

不需要额外创建Context,适合传递内容较少的场景:

第一步:改造 default.jsx 传参给children

const Default = ({children}) => {
  // 定义你需要传递的状态和函数,示例如下
  const [sidebarOpen, setSidebarOpen] = useState(true)
  const toggleSidebar = () => setSidebarOpen(prev => !prev)
  const layoutPayload = { sidebarOpen, toggleSidebar }

  return (
    <Layout>
      <Layout.Body id="main-content">
        <div>
          {/* 将children作为函数调用,传入参数 */}
          {children(layoutPayload)}
        </div>
      </Layout.Body>
    </Layout>
  )
}

第二步:改造 App.js 接收参数并传递给路由组件

// ... 原有代码
return <Route key={`layout-${layoutName}`} exact={true} path={layoutRoutes} render={() => {
  return (
    <ScrollToTop>
      {/* children改为函数形式,接收布局传递的参数 */}
      <LayoutTag>
        {(layoutProps) => (
          <>
            <h1>sdsdddscxcxs</h1>
            <Switch>
              {routesGroupedByLayouts[layoutName].map(route => (
                <Route key={route.path}
                       path={route.path}
                       exact={route.exact === true}
                       // 把布局参数、路由原生参数都传给页面组件
                       render={(routeProps) => <route.component 
                         fallback={<Loading />} 
                         {...routeProps} 
                         {...layoutProps}
                       />} 
                />
              ))}
            </Switch>
          </>
        )}
      </LayoutTag>
    </ScrollToTop>
  )
}} />

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 18:33:00