使用react-router根据 url 更改组件

IT技术 javascript reactjs flux
2021-05-14 05:48:00

这更多是关于react的架构问题而不是特定问题,但是使用布局组件和基于 url 呈现的几个子组件管理状态/props的最佳实践被认为是什么?

注意:我知道有人问过类似的问题,但这有点不同。[如何使用 React-Router 根据 URL / 路径更新 ReactJS 组件

假设我有类似以下代码的内容:个人资料页面(主布局视图),带有个人资料子部分(设置、首选项、帐户详细信息等)的导航链接,以及呈现每个子部分的主面板.

所以目前我会有这样的东西:我的路由器 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 呈现。但是我该如何管理 state 和 props 呢?按照我理解 React 和 Flux 的方式,我希望 Profile 组件管理状态并监听我的商店的变化,并将这些变化传播给它的子组件。这个对吗?

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

一些指导将不胜感激。

1个回答

我觉得你所做的一切都很好。你走在正确的道路上。

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

首先需要看一下cloneElement

它基本上会获取一个 React 元素,克隆它,然后返回另一个带有props的元素,您可以完全根据自己的需要更改、更改或替换这些props。

此外,将它与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>

使用这些工具在任何地方创建真正通用且可重用的组件。更常用的实用程序Childrenmap,forEachtoArray每个人都有自己的目标。

希望这可以帮助。