【发布时间】:2016-10-10 09:54:21
【问题描述】:
假设我有一个带有一些 React Router 导航的 Foo 组件:
var Foo = React.createClass({
render: function() {
return (<div>
<Link to="/foo/1">1</Link>;
<Link to="/foo/2">2</Link>;
{this.props.children}
</div>);
}
});
var Foo1 = React.createClass({
render: function() {
return <p>foo 1</p>;
}
});
var Foo2 = React.createClass({
render: function() {
return <p>foo 2</p>;
}
});
ReactDOM.render((
<Router>
<Route path="/" ...>
<Route path="foo" component={Foo}>
<Route path="1" component={Foo1} />
<Route path="2" component={Foo2} />
</Route>
</Route>
</Router>
), document.getElementById('main'));
现在假设我也有一个 Bar 组件,它非常相似(除了 bar 而不是 foo)。在“经典”的 React 应用程序中,我会“提取”出通用逻辑,如下所示:
var Element = React.createClass({
render: function() {
return (<div>
<Link to={this.props.url + '/1'}>1</Link>;
<Link to={this.props.url + '/2'}>2</Link>;
{this.props.children && React.cloneElement(this.props.children {
name: this.props.name // Ugly hack to propagate props...
})}
</div>);
}
});
var Element1 = React.createClass({
render: function() {
return <p>{this.props.name} 1</p>;
}
});
var Element2 = React.createClass({
render: function() {
return <p>{this.props.name} 2</p>;
}
});
var Foo = React.createClass({
render: function() {
return <Element url="/foo" name="foo" />;
}
});
var Bar = React.createClass({
render: function() {
return <Element url="/bar" name="bar" />;
}
});
如您所见,我几乎得到了它(即使是丑陋的道具传播黑客......)。我缺少的部分是如何定义路由本身:
ReactDOM.render((
<Router>
<Route path="/" ...>
<Route path="foo" component={Foo}>
<Route path="1" component={?} />
<Route path="2" component={?} />
</Route>
</Route>
</Router>
), document.getElementById('main'));
我的意思是,不再有 Foo1 和 Foo2 组件,因为 Foo 有一个 Element,它们通常是从中派生的。当然,我可以明确定义Foo1 以拥有Element1 和Foo2 以拥有Element2,但是我必须实现Foo 而不是让Element 为我做这件事;或者我可以将组件本身作为道具传递(即Foo = ... <Element ... component1={Foo1} component2={Foo2} />...但是然后呢?)。
那么:我如何在启用 React Router 的情况下实现这种 React-ious “通过组合继承”?还是有其他方法可以做到这一点?
【问题讨论】:
标签: reactjs react-router