Nachdem ich gelesen habe, wie schlecht Mixins sind und machte einige schlechte Erfahrungen von mir, möchte ich meinen Code Refactor, um Zusammensetzung über Mixins zu verwenden, um Wiederverwendbarkeit zu erreichen.Reagieren Mixin zu Zusammensetzung Refactor
Ich möchte eine Komponente, um Ereignisse zu emittieren und stylable zu sein. Also habe ich die Mixins EventEmitter, die Funktionen zur Manipulation der Ereignisse und Stylable enthält, die Funktionen enthält, um das Styling zu manipulieren.
var Styleable = {
addStyleProperty: function(styleProperty) {
...
},
...
};
var EventEmitter = {
addEventListener: function(eventName, func) {
},
...
};
Mit Mixins ein Beispiel Komponente sieht wie folgt aus:
var Button = React.createClass({
mixins = [EventEmitter, Styleable],
...
});
Mit Komposition Ich habe versucht, wie diese erstellen Komponenten für Styleable und EventEmitter:
var StylableComponent = React.createClass({
addStyleProperty: ...
render: function() {
React.createElement(this.props.wrappedComponent, ...)??
}
}
var EventEmitterComponent = ...
Aber ich nicht weiß, wie man sie richtig benutzt. Ich habe gelesen, dass ich diese Komponenten als Wrapper verwenden muss, aber ich weiß nicht, wie ich das erreichen soll. Ich habe versucht, es in der Render-Funktion des obigen Beispiels zu tun. Wie kann ich einen Button instanziieren, der genau wie die Mixin-Variante funktioniert? So dass ich nur die erforderlichen Funktionen wie folgt übergeben:
<Button is={[StyleableComponent, EventEmitterComponent]}/>
Oder erwarte ich ein falsches Verhalten von Zusammensetzung?
Ich habe die angegebenen Quellen gelesen, deshalb habe ich es zu Refactoring versucht. Es funktioniert gut, wenn es eine Funktionalität gibt, die ich hinzufügen möchte, wie EventEmitter. Wenn ich aber auch das Styleable hinzufügen möchte, habe ich eine Kette wie 'styleableWrapper', die dann die bereits umwickelte Komponente übernimmt, die mir übel riecht. Ich hoffe, Sie verstehen es. Ich habe auch keinen Zugriff mehr auf die Funktionen, die in 'eventEmitterWrapper' deklariert sind. – landunder
Komponenten höherer Ordnung können Komponenten höherer Ordnung umhüllen; es ist überhaupt nicht stinkend (es ist nur Funktion Zusammensetzung!). Ich denke, solange es keine gegenseitigen Abhängigkeiten gibt ... wird es ein bisschen stinken, wenn 'styleableWrapper' von 'eventEmitterWrapper' abhängt, aber das klingt nicht so. –
Für Ihren Kommentar, dass Sie keinen Zugriff auf Funktionen haben, die in 'eventEmitterWrapper' deklariert sind, müssen sie als Requisiten übergeben werden. Da jeder HOC alle delegierten Requisiten übergibt, wird alles, was du passierst, von '{this.props}' gesammelt. –