使用反应路由器基于URL更改组件

时间:2016-06-24 05:55:52

标签: javascript reactjs flux

这更像是一个关于反应而不是特定问题的架构问题,但是什么被认为是使用布局组件管理状态/道具的最佳实践,以及基于URL呈现的几个子组件?

注意:我知道已经提出了类似的问题,但这有点不同。 [How to update ReactJS component based on URL / path with React-Router

让我们说我有类似下面的代码:一个配置文件页面(主要布局视图),带有导航链接的配置文件子部分(设置,首选项,帐户详细信息等),以及一个主面板,其中每个子部分呈现。

所以目前我会有这样的事情: 我的路由器 的 routes.js

<Router history={browserHistory}>
  <Route path='/profile' component={Profile} >
    <IndexRoute component={Summary} />
    <Route path='/profile/settings' component={Settings} />
    <Route path='/profile/account' component={Account} />
    <Route path='/profile/preferences' component={Preferences} />
  </Route>
</Router>

以及我的个人资料布局组件的精简版本 的 profile.js

class Profile extends React.Component {

  constructor(props) {
    super(props)
  }

  render(){

    let pathName = this.props.location.pathname;

    return(
      <div className='container profile-page'>
        <div className='side-nav'>
          <ul>
            <li><Link to='/profile'>Summary</Link></li>
            <li><Link to='/profile/settings'>Settings</Link></li>
            <li><Link to='/profile/account'>My Account</Link></li>
            <li><Link to='/profile/preferences'>Preferences</Link></li>
          </ul>
        </div>
        <div className='main-content'>
         {this.props.children}
        </div>
      </div>
    )
  }
}

export default Profile;

所以这种作品。子组件将基于URL呈现。但那我该如何管理州和道具呢?我理解React和Flux的方式,我希望Profile组件管理状态并监听我的商店中的更改,并将这些更改传播给它的子项。它是否正确?

我的问题是,似乎没有一种直观的方式将道具传递给this.props.children呈现的组件,这让我觉得我当前的架构和/或对通量的理解是不正确的。

我们非常感谢您的一些指导。

1 个答案:

答案 0 :(得分:2)

我觉得你在做的事情非常好。你是在正确的道路上。

React为您提供了一系列API,可以准确地处理您不确定如何实现的内容(way to pass props to components rendered by this.props.children

首先,您需要查看cloneElement

它基本上会使用一个React元素,克隆它,并返回另一个带有道具的东西,你可以根据自己的需要完全改变,改变或替换。

此外,将它与Children Utilities - 循环结合通过提供给顶级组件的子项并对每个元素进行必要的更改。

建议的样本用法可以像

一样简单
<div className='main-content'>
    {React.children.map(this.props.children, (child, index) => {
       //Get props of child
       const childProps = child.props;

       //do whatever else you need, create some new props, change existing ones
       //store them in variables

       return React.cloneElement(child, {
           ...childProps, //these are the old props if you don't want them changed
           ...someNewProps,
           someOldPropOverwritten, //overwrite some old the old props 
       });
     )}
</div>

使用这些工具在任何地方创建真正通用且可重复使用的组件。来自Children的更常用的实用程序是mapforEachtoArray。每个人都有各自的目标。

希望这有帮助。