Ответ 1
Я не знаю специфики Ratchet, но в общих чертах реагировать, в вашей ситуации, лучше для нижнего колонтитула помещать его внутри RouteHandler, чтобы вы могли определить его присутствие в зависимости от ваших предпочтений.
Для заголовка, я считаю, вы всегда хотели бы иметь его там? В этом случае вы можете оставить его за пределами обработчика и передать его свойства, чтобы изменить его расположение.
Конечный результат будет выглядеть примерно так (импорт компонентов подразумевается, поэтому я не включаю их для того, чтобы сосредоточиться на логике):
app.js:
<Route handler={AppHandler}>
<DefaultRoute handler={HomeHandler}/>
<Route name='foo' path='/foo' handler={FooHandler}/>
<Route name='bar' path='/bar' handler={BarHandler}/>
<NotFoundRoute handler={NotFoundHandler}/>
</Route>
);
App.react.js:
<div>
<Header title={this.state.title}/>
<RouteHandler {...this.props}/>
</div>
Header.react.js - используя некоторые воображаемые компоненты для иллюстрации:
var Header = React.createClass({
render: function(){
return (
<div>
<Button type="previous" title="Left"/>
<HeaderTitle>{this.props.title}</HeaderTitle>
<Button type="next" title="Right"/>
</div>
);
}
});
module.exports = Header;
Foo.react.js:
var Foo = React.createClass({
render: function(){
var footerActions = [ // Ideally you'd get this from a constants file or something alike.
{
'actionType': 'viewHome',
'actionIcon': 'icon-home',
'actionLabel': 'Home'
},
{
'actionType': 'viewProfile',
'actionIcon': 'icon-profile',
'actionLabel': 'Profile'
},
{
'actionType': 'viewFavorites',
'actionIcon': 'icon-favorites',
'actionLabel': 'Favorites'
},
...
];
return (
<div>Your content here</div>
<Footer actions={footerActions}/>
);
}
});
module.exports = Foo;
Footer.react.js:
var Footer = React.createClass({
render: function(){
var actionItems = this.props.actions.map(function(item){
return (<ActionItem action={item.actionType} icon={item.actionIcon} label={item.actionLabel}/>);
});
return (
<div>{actionItems}</div>
)
}
});
module.exports = Footer;
Затем в Bar.react.js вы можете просто не включать компонент <Footer>
, например:
Bar.react.js:
var Bar = React.createClass({
render: function(){
return (
<div>Your content here</div>
);
}
});
module.exports = Bar;
Надеюсь, что это поможет!