Lassen Sie uns sagen, ich habe eine Foo Komponente mit einigen Router Reagieren Navigation:Erweiterung Komponenten mit React Router
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'));
Lassen Sie uns jetzt sagen, dass ich auch eine Bar-Komponente haben, die sehr ähnlich ist (mit Ausnahme von, na ja, bar
statt foo
). In einer „klassischen“ React Anwendung, hätte ich „extrahiert“ die gemeinsame Logik aus, etwa so:
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" />;
}
});
Wie Sie sehen können, habe ich fast es wurde (sogar, dass hässliche Ausbreitung Hack Requisiten. ..). Der Teil fehlt mir ist, wie das Routing zu definieren selbst:
ReactDOM.render((
<Router>
<Route path="/" ...>
<Route path="foo" component={Foo}>
<Route path="1" component={?} />
<Route path="2" component={?} />
</Route>
</Route>
</Router>
), document.getElementById('main'));
ich meine, es gibt nicht mehr Foo1
und Foo2
Komponenten, weil Foo eine Element
hat, aus dem sie allgemein abgeleitet werden. Ich könnte natürlich Foo1
explizit definieren, um eine Element1
und Foo2
zu haben, um eine Element2
zu haben, aber dann würde ich Foo
implementieren müssen, anstatt die Element
es für mich machen zu lassen; oder vielleicht könnte ich die Komponenten selbst als Requisiten übergeben (also Foo = ... <Element ... component1={Foo1} component2={Foo2} />
... aber was dann?).
Also: wie kann ich diese reaktive "Vererbung über Komposition" mit React Router erreichen? Oder gibt es einen anderen Weg, das zu tun?