将道具传递给路由器内部的组件

Posted

技术标签:

【中文标题】将道具传递给路由器内部的组件【英文标题】:Passing props to component inside router 【发布时间】:2017-05-29 16:40:01 【问题描述】:

我想为我的应用使用 URL 路径。目前我只是在app.js 中渲染一个Main 组件:

render() 
  return (
    <Main 
      isLoggedIn=this.state.isLoggedIn
      user=this.state.user
      ... />
  )

(props是一堆变量和函数)

我尝试使用react-router,但我不明白如何向子组件发送道具。

<Router history=browserHistory >
  <Route path='/' component=Main
    ... where to send props? />
  <Route path='join' component=Join
    ... props />
</Router>

问题是我需要我的App 组件(在app.js)的一些状态变量在MainJoin 中都可用。如何使用路由器实现这一目标?

应用结构:

App
 - Join
 - Main
   - ...

【问题讨论】:

【参考方案1】:

这取决于您如何管理您的状态。如果你使用 Redux,你不需要在路由器中传递 props,你可以使用 connect 简单地访问任何组件中的 redux,但是如果你不使用 react 那么你可以使用 Redux 路由器的层次结构功能

假设您有类似这样的路线

<route path="/student" component=studentHome>
   <route path="/class" component=classHome />
</route>

当你访问路径时

/student/class

React 路由器会将 classHome 组件加载为 StudentHome 的子组件,您可以简单地将 props 传递给 classHome 组件。

你的学生类的渲染方法会是这样的

render()
     const childrenWithProps = React.Children.map(this.props.children,
     (child) => React.cloneElement(child, 
       doSomething: this.doSomething
     )
    );

    return <div> some student component functionality
                <div>
                 childrenWithProps
                </div>
           </div>

有关将道具传递给孩子的更多详细信息: How to pass props to this.props.children

【讨论】:

我需要将我的状态保持在 Main 和 Join 之上一个级别,但我不知道使用这种方法会如何工作。 Main 和 Join 在不同的路径上,但需要访问相同的 props。 我实际上设法通过将状态向下移动一级(到 Main)来解决它,并将 Main 作为其余路由/组件的容器路由。谢谢。【参考方案2】:

您可以使用标准 URL 参数。例如,传递一个 ID:

<Route path='join/:id' component=Join/>

您需要使用 browserHistory:

browserHistory.push(`/join/$id`);

然后在Join 上使用this.props.params.id

这里有更深入的解释https://***.com/a/32901866/48869

【讨论】:

我需要传递几个变量以及一些函数,所以不幸的是我认为这种方法行不通。 在这种情况下,用您想要发送的内容更新您的问题,以便更容易理解。

以上是关于将道具传递给路由器内部的组件的主要内容,如果未能解决你的问题,请参考以下文章

在 React 路由器 5 中使用变量(不是静态组件)将道具传递给组件

Vue - 通过路由器将道具传递给组件

Vue路由器将道具传递给动态加载的孩子

在 react-router v4 中将自定义道具传递给路由器组件

在 react-router v4 中将自定义道具传递给路由器组件

如何使用 Vue.js 路由器将状态和事件处理程序作为道具传递给子组件?