2017-05-22 3 views
0

Ich möchte den Status über eine Funktion aktualisieren, die ich über das onChange-Attribut über props an die untergeordnete Komponente übergebe. Dies ist in der Kind-Komponente:Aktualisierungsstatus über Funktion, die über Requisiten übergeben wurde

<input className="minutes" type="number" defaultValue={ this.props.minutes } onChange={ this.props.updatePreferences("minutes", this.value) }/> minutes. 

Während dies ist die Funktion in der übergeordneten Komponente:

updatePreferences = (preferenceName, enteredValue) => { 
    switch (preferenceName) { 
     case preferenceName === "minutes": 
     this.setState({minutes: enteredValue}) 
     console.log(this.state) 
     return 
     case preferenceName === "business": 
     this.setState({...this.state, interests: { 
      ...this.state.interests, business: !this.state.interests.business}}) 
     return 
     default: 
     return 
    } 
    } 

die dann über die Strecke, um das Kind weitergegeben wird:

<Route exact path="/" render={props => <Welcome minutes = {this.state.minutes} 
                  interests = {this.state.interests} 
                  sayHello = {this.sayHello} 
                  updatePreferences = {this.updatePreferences} />} /> 
+2

Versuchen Sie 'onChange = {this.props.updatePreferences (" minutes ", this.value)}' in 'onChange = {() => this.props.updatePr zu ändern Referenzen ("Minuten", this.value)} '. – adrice727

+0

Danke, aber es funktioniert nicht, zeigt nichts auf der Konsole, wenn ich – ocram

Antwort

0

defaultValue wird nur während des Mounts gesetzt und kann daher nicht geändert werden, wenn ein Rendervorgang ausgeführt wird. (Es sei denn, Sie aktualisieren mit einem ref).

Auch möchten Sie nicht die updatePreferences Methode beim Rendern aufrufen, so müssen Sie bind oder verwenden Sie eine Pfeilfunktion.

Verwenden value statt prop eine gesteuerte Komponente zu erstellen:

<input className="minutes" 
     type="number" 
     value={ this.props.minutes } onChange={() => this.props.updatePreferences("minutes", this.value) }/> minutes. 
+0

eingeben Danke. Warum sollte ich den Wert ändern? – ocram

+0

'defaultValue' ohne einen' Wert' erzeugt eine unkontrollierte Komponente. Unkontrollierte Komponenten müssen ihren zugrunde liegenden Wert mit einem "ref" ändern und werden beim Re-Rendern keine Änderungen an "requisiten" vornehmen. –

0

Zwei Dinge, damit es funktioniert:

(e) => this.props.updatePreferences("minutes", e.target.value) 

und die Syntax der switch-Anweisung war falsch:

switch (preferenceName) { 
    case "minutes": 
    this.setState({minutes: enteredValue}) 
    return 
    case "business": 
    this.setState({...this.state, interests: { 
     ...this.state.interests, business: !this.state.interests.business}}) 
    return 
    default: 
    return 
} 
Verwandte Themen