React路由器将特定参数传递给子组件

问题描述:

我有一个令人困惑的问题,我无法弄清楚。我是新来的反应+通量+反应路由器。React路由器将特定参数传递给子组件

我有以下途径:

<Router history={browserHistory} > 
    <Route path="/" component={App}> 
     <IndexRoute component={Search}/> 
     <Route path="/login" component={Login} /> 
     <Route name="client" path="/client(/:clientid)" component={Client}/> 
     {/* <Route name="tel" path="/tel/:telid" component={Tel}/>*/} 
    </Route> 
</Router> 

我希望能够具体PARAMS传递给特定的路由。我知道我可以通过所有PARAMS使用的所有路由:

{this.props.children && React.cloneElement(this.props.children, {...})} 

但是我不希望让子组件访问其他组件状态。理想情况下,我想将loginState传递给登录组件,将searchState传递给搜索组件,将clientState传递给客户端组件。通过上述方法,客户端组件可以访问所有组件状态。

我现在有这个解决办法,但感觉很脏,不是很面向未来:

var React = require('react'); 

var AppStore = require('../stores/AppStore'); 

var browserHistory = require('react-router').browserHistory; 

// Flux cart view 
var App = React.createClass({ 

    getInitialState() { 
     return AppStore.getState(); 
    }, 

    componentWillMount() { 
     if (!this.state.auth.loggedIn) { 
      browserHistory.push('/login'); 
     } 
    }, 
    // Add change listeners to stores 
    componentDidMount() { 
     AppStore.addChangeListener(this._onChange); 
    }, 

    // Remove change listers from stores 
    componentWillUnmount() { 
     AppStore.removeChangeListener(this._onChange); 
    }, 

    // Method to setState based upon Store changes 
    _onChange(){ 
     this.setState(AppStore.getState()); 
    }, 

    // Render cart view 
    render() { 
    console.log(this.props.children); 
    var name = this.props.children.type.displayName; 
    var p; 
    switch(name) { 
     case 'client': 
      p = {clientState: 'test'} 
     break; 
     case 'login': 
      p = {auth: this.state.auth} 
     break; 
    } 
    return (
     <div> 
      {this.props.children && React.cloneElement(this.props.children, p)} 
     </div> 
    ); 
    } 

}); 

module.exports = App; 

关于如何正确做到这一点有什么想法?我已经看了很多谷歌的结果,但大多数回到旧版本的反应和反应路由器。

+0

我希望,你以后是不是也有用[路由器组件]的[createElement](https://github.com/reactjs/react-router/blob/master/docs/API.md#createelementcomponent-props) –

+0

@ code-jaff感谢你 - 新的如何wou我执行那个?它是在主要的应用程序控制器(主要路线),我认为它的一个简单覆盖该功能的情况?你能否详细解答一下答案? – 4razmus

可以使用named components

...  
<Route path="/login" components={{login:Login}} /> 
<Route path="/client(/:clientid)" components={{client:Client}}/> 
... 

而且在应用组件

class App extends Component { 
    constructor(props){ 
     super(props); 
     this.setProps= this.setProps.bind(this); 
    } 
    setProps(comp, props){ 
     if(!comp) return null; 
     return React.cloneElement(comp, props); 
    } 
    render(){ 
     const {client, login}=this.props; 
     const {clientData, loginData}=this.state; 

     return (<div> 
      {this.setProps(client,clientData)} 
      {this.setProps(login,loginData)} 
     </div>); 
    } 
} 

export default App; 

当页面上更多的则每条路线的一个组成部分

+0

不得不改变一些项目,以便在对象内部传递数据并将其转换为模块而不是ES6,但是谢谢 - 所有工作都按预期工作。 – 4razmus