2016-02-09 11 views
6

Ich lerne gerade React und ich schreibe Komponenten mit ES7-Syntax. Meine Idee ist es, eine Basiskomponente zu erstellen, die einige Methoden enthält, die alle abgeleiteten Komponenten haben sollen. Zum Beispiel möchte ich valueLink without the mixin implementieren, für die Zwei-Wege-Bindung in allen meinen Komponenten. Hier ist meine Idee:Ist es eine gute Übung, Basiskomponenten zu erstellen und sie dann in React zu erweitern?

class MyComponent extends React.Component { 

    bindTwoWay(name) { 
     return { 
      value: this.state[name], 
      requestChange: (value) => { 
       this.setState({[name]: value}) 
      } 
     } 
    }; 
} 

 

class TextBox extends MyComponent { 
    state = { 
     val: '' 
    }; 

    render() { 
     return (<div> 
      <input valueLink={this.bindTwoWay('val')}/> 
      <div>You typed: {this.state.val}</div> 
     </div>) 
    } 
} 

Und es funktioniert gut. Ich konnte jedoch nicht viele Informationen über diese Methode finden. Es geht nicht um ValueLink, das war nur ein Beispiel. Die Idee ist, einige Methoden in einer Basiskomponente zu haben und diese Komponente später zu erweitern, so dass abgeleitete Komponenten alle diese Methoden haben, wie die übliche OOP-Methode. Also würde ich gerne wissen, ob das vollkommen in Ordnung ist oder ob mir ein paar Fehler bekannt sind. Vielen Dank.

+1

Die meisten Leute würden "Nein" sagen. Zusammensetzung vor Vererbung bevorzugen. Dies funktioniert jedoch nicht immer, Ihr Fall könnte einer dieser Fälle sein. * "oder es gibt einige Fehler" * Der größte Unterschied zwischen Vererbung und Mixins ist, dass eine Klasse viele Mixins verwenden kann, aber sie kann nur einen Elternteil haben. Das macht die Vererbung viel weniger flexibel. –

+1

+1 zu @FelixKling, Zusammensetzung über Vererbung wo möglich. Ich würde lieber eine Komponente sehen, die etwas wie const bindTwoWay = require ("../ mixins/bindTwoWay") explizit ausführt, als etwas in einer verschachtelten Hierarchie zu jagen. –

+0

@FelixKling Ich sehe Ihren Punkt, aber immer noch, auch wenn Klasse kann ein Elternteil haben, und wenn ich wirklich nur einen Elternteil brauche, wäre dies immer noch eine feine Sache zu tun, nicht wahr? Da wir Mixins nicht mit ES6 Syntax verwenden können ... – tuks

Antwort

3

Das ist völlig in Ordnung, es ist nur grundlegende Vererbung. Der Nachteil der Verwendung von Vererbung zum Ersetzen von Mixins besteht darin, dass es keine Mehrfachvererbung gibt. Daher können Sie Ihren TextBox-Funktionen nicht mehrere Basisklassen zuweisen, als würden Sie mehrere Mixins eingeben. Um dies zu umgehen, können Sie component composition verwenden. In Ihrem Fall funktioniert die Komposition nicht direkt wie im Beispiel definiert, aber es gibt einen Workaround.

Zuerst müssen Sie eine Komposition Komponente

export default (ComposedComponent) => { 
    class MyComponent extends React.Component { 
    constructor(props, state) { 
     super(props, state); 
     this.state = { 
     val: '' 
     }; 
    } 
    bindTwoWay(name) { 
     return { 
     value: this.state[name], 
     requestChange: (value) => { 
      this.setState({[name]: value}) 
     } 
     }; 
    } 

    render() { 
     return (
     <ComposedComponent 
      {...this.props} 
      {...this.state} 
      bindTwoWay={this.bindTwoWay.bind(this)} 
     /> 
     } 
    } 
    } 

    return MyComponent 
} 

definieren und Sie dann Ihre Komponente definieren, wo Sie einige gemeinsame Merkmale benötigen

import compose from 'path-to-composer'; 

class TextBox extends React.Component { 
    render() { 
    return (
     <div> 
     <input valueLink={this.props.bindTwoWay('val')}/> 
     <div>You typed: {this.props.val}</div> 
     </div> 
    ) 
    } 
} 

export default compose(TextBox) 

ich nicht getestet haben, aber es sollte funktionieren.

+1

Ths wird nicht funktionieren. Es sollte '{this.props.val}' anstelle von '{this.state.val}' sein. Und Sie sollten die Initialisierung in der Komponente höherer Ordnung tun. – fl0cke

+3

@ fl0cke Sie haben die Beispiele korrigiert. –