2017-10-12 5 views
0

Ich möchte eine große Komponente modularisieren, damit ich einige ihrer Teile wiederverwenden kann.Aufruf von setState von einer Funktion, die als Requisite übergeben wurde

Beide Male eine Liste gerendert, auf der ich Operationen ausführen kann: aktualisiert meine modals Zustand, so dass es schließt, startet dann eine Redux-Aktion mit einem Server-Aufruf.

So würde Ich mag eine Funktion zu übergeben, die das Verhalten benutzerdefinierte definiert:

var handleSubmit = (name, description, author) => { 

    if (inputsValidated(name, description)) { 
     this.setState({ addingNewProject: false, errorMessage: '' }); 

     var payload = { name: name, date: new Date(), description: description, author: author}, 
      routeToPushAfter = `/app/users/${author._id || 'notsigned'}`, 
      serverRoute = allRoutes.projectURL, 
      type = 'project' 

      this.props.postData(payload, routeToPushAfter, serverRoute, type); 
    } 

    else { 
     this.setState({ errorMessage: 'Please fill out form' }); 
    } 
} 

Dann diese Funktion an die Komponente zu übergeben.

render() { 
    return (
     <div style={main}> 
      <DynamicList {...this.props} /> 
      <DynamicList {...this.props} handleSubmit={handleSubmit} handleDelete={handleDelete} /> 
     </div> 
    ); 
} 

Das Problem ist: die this.setState wird an die übergeordnete Komponente gebunden ist. Wie könnte ich eine Funktion übergeben, mit der ich den lokalen Zustand ändern kann (ohne Redux zu verwenden).

Vielen Dank für jede Eingabe!

+1

Sie eine [hohe Auftragskomponente] verwenden (https://reactjs.org/docs/higher-order-components. html) –

+0

Anstatt die Fehlermeldung auf dem Status zu halten, sollten Sie die Fehlermeldung in die Liste als Teil der Requisiten übergeben. Ja, das ist das HOC-Konzept. – robbymurphy

+0

Ich lese jetzt die HOC, danke. @robbymurphy, das würde die Fehlermeldung lösen, aber nicht das AddingNewProject Boolean, das ich für das Modal zum Öffnen und Schließen brauche. – DSz

Antwort

-1

Sie können die Funktion der Komponente innerhalb DynamicList ‚s Konstruktor binden:

constructor(props) { 
    super(props); 
    if (this.props.handleSubmit) { 
    this.handleSubmit = this.props.handleSubmit.bind(this); 
    } 
} 
+1

Dies ist ein Pflaster. Dadurch wird eine enge Verbindung zwischen der DynamicList und ihrem Container hergestellt. Die DynamicList sollte "dumm" sein und einfach Requisiten akzeptieren, die angeben, wie sie gerendert werden soll, anstatt ihren eigenen Fehlerzustand zu behandeln. Zumal die Funktion, die den Fehler verursacht, außerhalb der DynamicList-Komponente liegt. – robbymurphy

Verwandte Themen